日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

为什么有时优盘是只读模式_JS专题之严格模式

發(fā)布時(shí)間:2025/3/15 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么有时优盘是只读模式_JS专题之严格模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ECMAScript 5 引入了 strict mode ,現(xiàn)在已經(jīng)被大多瀏覽器實(shí)現(xiàn)(從IE10開始)

一、什么是嚴(yán)格模式

顧名思義,JavaScript 嚴(yán)格模式就是讓 JS 代碼以更嚴(yán)格的模式執(zhí)行,不允許可能會(huì)引發(fā)錯(cuò)誤的代碼執(zhí)行。在正常模式下靜默失敗的代碼,嚴(yán)格模式下就會(huì)拋出錯(cuò)誤。

二、為什么要過(guò)渡到嚴(yán)格模式

  • 嚴(yán)格模式下的代碼在運(yùn)行的時(shí)候,更容易通過(guò)拋出的錯(cuò)誤定位到問(wèn)題所在的地方
  • 嚴(yán)格模式能夠幫助你編寫更符合規(guī)范的代碼
  • 消除 JavaScript 語(yǔ)言上一些不合理,比較怪異的行為
  • 為未來(lái)新版本的 JavaScript 做鋪墊
  • 有時(shí)候,嚴(yán)格模式下的 JavaScript 代碼運(yùn)行起來(lái)更快
  • 三、如何使用

    · 腳本文件范圍

    將 "use strict"; 放在腳本文件的第一行。整個(gè)腳本文件就會(huì)以“嚴(yán)格模式”執(zhí)行。

    · 函數(shù)作用域范圍

    將 "use strict"; 放在函數(shù)體的第一行,則整個(gè)函數(shù)以"嚴(yán)格模式"運(yùn)行。

    文件合并時(shí),寫在腳本文件第一行的 "use strict"; 來(lái)實(shí)現(xiàn)嚴(yán)格模式會(huì)失效,可以將腳本文件的代碼放在一個(gè)立即執(zhí)行表達(dá)式中。

    (funciton() {"use strict";... })()

    四、嚴(yán)格模式的具體定義

  • 嚴(yán)格模式下無(wú)法再隱式創(chuàng)建全局變量 也就是,變量必須聲明后才能使用,正常模式直接賦值給一個(gè)未定義的變量時(shí),會(huì)將變量定義為全局變量。
  • "use strict"; var a = b = 3; // Uncaught ReferenceError: b is not defined ? 以上代碼等于: var a; b = 3; a = b; ?
  • 禁止 this 關(guān)鍵字指向全局對(duì)象 正常模式下,函數(shù)中如果沒(méi)有指明 this 對(duì)象,JS 則會(huì)將 this 隱式指向?yàn)槿謱?duì)象。如果綁定的值是非對(duì)象,將被自動(dòng)轉(zhuǎn)為對(duì)象再綁定上去,而 null 和 undefined 這兩個(gè)無(wú)法轉(zhuǎn)成對(duì)象的值,將被忽略。
  • 嚴(yán)格模式下,必須指明 this 的指向?qū)ο蟆H绻麤](méi)有指明的話,this的值為 undefined

    var name = "foo"; function func() {"use strict";this.name; // Uncaught TypeError: Cannot read property 'name' of undefined } func(); // 沒(méi)有加 new 關(guān)鍵字 new func(); ? function func() {return this } ? func() // window func.call(8) // Number {8} func.call(true) // Boolean {true} func.call("abcd") // {"abcd"} func.call(null) // window func.call(undefined) // window ? "use strict" function func() {return this } ? func() // undefined func.call(8) // 8 func.call(true) // true func.call(null) //null func.call(undefined) // undefined
  • 不允許在函數(shù)內(nèi)部遍歷調(diào)用棧 禁止使用 arguments.callee、arguments.caller、fn.caller、fn.callee; 在嚴(yán)格模式下,arguments.callee 是一個(gè)不可刪除屬性,而且賦值和讀取時(shí)都會(huì)拋出異常
  • function func() {"use strict";func.caller; // 報(bào)錯(cuò)func.arguments; // Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them } func()
  • 禁止向?qū)ο蟮闹蛔x屬性賦值,禁止刪除對(duì)象的不可設(shè)置屬性, 禁止向不可擴(kuò)展的對(duì)象添加屬性 無(wú)法刪除 var 聲明的變量。
  • 在正常模式中,給對(duì)象的只讀屬性賦值, 刪除對(duì)象的不可設(shè)置屬性,添加不可擴(kuò)展對(duì)象的新屬性,會(huì)靜默失敗。

    但是在嚴(yán)格模式中,會(huì)拋出錯(cuò)誤。 另外,字符串的屬性 length 也是只讀屬性,修改后會(huì)報(bào)錯(cuò)。

    "use strict"; var str = "abc" str.length = 8 // Uncaught TypeError: Cannot assign to read only property 'length' of string 'abc' ? 'use strict'; var obj = Object.defineProperty({}, 'a', {value: 37,writable: false }); obj.a = 123; // Uncaught TypeError: Cannot assign to read only property 'a' of object '# ? 'use strict'; var obj = Object.defineProperty({}, 'p', {value: 37,configurable: false }); delete obj.p // Uncaught TypeError: Cannot delete property 'p' of #<Object> ? var obj = {}; Object.preventExtensions(obj); obj.title = "hello"; // Uncaught TypeError: Cannot add property title, object is not extensible
  • 對(duì)象不允許有重名的屬性,函數(shù)不允許有重名的參數(shù) 在正常模式中,對(duì)象的重名屬性,位置靠后會(huì)覆蓋位置靠前的重名屬性。函數(shù)也是,函數(shù)體查找到的參數(shù),靠后的重名參數(shù)會(huì)覆蓋靠前的重名參數(shù)。
  • "use strict"; var o = { p: 1,p: 2}; // IE報(bào)錯(cuò):strict 模式下不允許一個(gè)屬性有多個(gè)定義, 新版的 Chrome 和 firefox 并不會(huì)報(bào)錯(cuò),會(huì)采用覆蓋機(jī)制。 ? "use strict"; function func(a, a) {console.log(a) } func(1, 2) // IE報(bào)錯(cuò): strict 模式下不允許正式參數(shù)名稱重復(fù)。新版的 Chrome 和 firefox 并不會(huì)報(bào)錯(cuò),會(huì)采用覆蓋機(jī)制。
  • 靜態(tài)綁定 JavaScript 支持動(dòng)態(tài)綁定,也就是 JavaScript 的屬性和方法是在運(yùn)行時(shí)確定,而不是在編譯時(shí)確定。 于是,JavaScript 嚴(yán)格模式禁用了 with 語(yǔ)句, 因?yàn)槭褂昧?with 語(yǔ)句,with 語(yǔ)句塊中變量無(wú)法確定是外部全局變量還是傳入的對(duì)象屬性。
  • "use strict"; var x = 17; with (obj) // !!! 語(yǔ)法錯(cuò)誤 {// 如果沒(méi)有開啟嚴(yán)格模式,with 中的這個(gè)x會(huì)指向 with 上面的那個(gè) x,還是obj.x?// 如果不運(yùn)行代碼,我們無(wú)法知道,因此,這種代碼讓引擎無(wú)法進(jìn)行優(yōu)化,速度也就會(huì)變慢。x; // Uncaught SyntaxError: Strict mode code may not include a with statement }

    eval 關(guān)鍵字不再會(huì)給上層函數(shù)(surrounding function)或者全局引入一個(gè)新的變量。在嚴(yán)格模式中,eval 語(yǔ)句會(huì)創(chuàng)建自己的一個(gè)作用域,eval 里的變量只能在 eval 內(nèi)部使用。

  • arguments 的限定 嚴(yán)格模式規(guī)定名稱為 eval 和 arguments 不能通過(guò)程序語(yǔ)法被綁定(be bound)或賦值 嚴(yán)格模式下,參數(shù)的值不會(huì)隨 arguments 對(duì)象的值的改變而變化。
  • 正常模式中,對(duì)參數(shù)重新賦值,會(huì)修改 arguments 類數(shù)組對(duì)象下的參數(shù)值。同時(shí),修改 arguments 類數(shù)組對(duì)象的值,也會(huì)修改函數(shù)參數(shù)的值。

    嚴(yán)格模式下,不僅參數(shù)的值不會(huì)隨著 arguments 類數(shù)組對(duì)象的變化而變化,參數(shù)的變化也不會(huì)引起 arguments 對(duì)象的變化,arguments 對(duì)象會(huì)記住參數(shù)的傳入初始值。

    function func(a) { "use strict"a = 8;// arguments[0] = 8return [a, arguments[0]] } ? func(3) // [8, 3] ? function func(a) { "use strict"arguments[0] = 8return [a, arguments[0]] } ? func(3) // [3, 8]
  • ES5禁止在非函數(shù)代碼塊聲明函數(shù) ES5 的嚴(yán)格模式只允許在全局作用域或函數(shù)作用域聲明函數(shù)。也就是說(shuō),不允許在非函數(shù)的代碼塊內(nèi)聲明函數(shù)。
  • if (true) {function add() {} } add()for (var i = 0; i < 5; i++){function f2() { } // !!! 語(yǔ)法錯(cuò)誤f2(); }以上代碼在嚴(yán)格模式是禁止的,但是在 ES6 中,是允許在代碼塊中聲明函數(shù)的。
  • 保留關(guān)鍵字 嚴(yán)格模式中一部分字符變成了保留的關(guān)鍵字。這些字符包括implements, interface, let, package, private, protected, public, static和yield。在嚴(yán)格模式下,你不能再用這些名字作為變量名或者形參名
  • function private() {"use strict" } //Uncaught SyntaxError: Unexpected strict mode reserved word
  • 嚴(yán)格模式禁止八進(jìn)制數(shù)字語(yǔ)法
  • 五、向嚴(yán)格模式過(guò)渡

    嚴(yán)格模式能夠幫助我們寫出更安全,更有規(guī)范的代碼,則應(yīng)該避免一些危險(xiǎn)的寫法,采用更好的寫法:

  • 變量先聲明,再使用,
  • this 應(yīng)該在指向自己創(chuàng)建的對(duì)象時(shí)使用。
  • arguments 應(yīng)該在函數(shù)第一行就拷貝出來(lái)。
  • 六、嚴(yán)格模式的缺點(diǎn)

  • 現(xiàn)在的代碼都會(huì)進(jìn)行文件壓縮和合并,此時(shí)嚴(yán)格模式就會(huì)失效。
  • 總結(jié)

    現(xiàn)在的 webpack 會(huì)在打包的時(shí)候默認(rèn)是嚴(yán)格模式,所以現(xiàn)在不用再手動(dòng)寫 use strict了。嚴(yán)格模式能幫助我們以更規(guī)范的方式書寫代碼,但是無(wú)論是否嚴(yán)格模式,都應(yīng)該注意代碼的規(guī)范,避免隱式 bug 的出現(xiàn)。

    2018/02/08 @Starbucks

    歡迎關(guān)注我的個(gè)人公眾號(hào)“謝南波”,專注分享原創(chuàng)文章。

    總結(jié)

    以上是生活随笔為你收集整理的为什么有时优盘是只读模式_JS专题之严格模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。