摘要:概述的嚴格模式是中的一種限制性更強的變種方式。嚴格模式在語義上與正常的有一些不同。首先,嚴格模式會將陷阱直接變成明顯的錯誤。嚴格模式禁止刪除聲明變量。
概述
ECMAScript 5的嚴格模式是JavaScript中的一種限制性更強的變種方式。嚴格模式不是一個子集:它在語義上與正常代碼有著明顯的差異。不支持嚴格模式的瀏覽器與支持嚴格模式的瀏覽器行為上也不一樣, 所以不要在未經嚴格模式特性測試情況下使用嚴格模式。嚴格模式可以與非嚴格模式共存,所以腳本可以逐漸的選擇性加入嚴格模式。
嚴格模式在語義上與正常的JavaScript有一些不同。 首先,嚴格模式會將JavaScript陷阱直接變成明顯的錯誤。其次,嚴格模式修正了一些引擎難以優化的錯誤:同樣的代碼有些時候嚴格模式會比非嚴格模式下更快。 第三,嚴格模式禁用了一些有可能在未來版本中定義的語法。
如果你想讓你的JavaScript代碼在嚴格模式下運行,可以參考轉換成嚴格模式。
開啟嚴格模式 作用于整個腳本文件需要在所有語句之前放一個特定語句 "use strict"; (或 "use strict";)注意必須是腳本開始第一行,否則無效
// 整個語句都開啟嚴格模式的語法 "use strict"; var v = "Hi! I"m a strict mode script!";
合并不同模式的代碼文件成一個文件,需要特別注意:
這種語法存在陷阱,有一個大型網站已經被它坑倒了:不能盲目的合并沖突代碼。試想合并一個嚴格模式的腳本和一個非嚴格模式的腳本:合并后的腳本代碼看起來是嚴格模式。反之亦然:非嚴格合并嚴格看起來是非嚴格的。合并均為嚴格模式的腳本或均為非嚴格模式的都沒問題,只有在合并嚴格模式與非嚴格模式有可能有問題。建議按一個個函數去開啟嚴格模式(至少在學習的過渡期要這樣做)
同樣講"use strict";置于函數開始的第一行
測試生效:
!function(){ "use strict"; x=1; console.log(x); //因嚴格模式不允許未聲明的變量被賦值,會報錯 }();
報錯信息:
$ node 嚴格模式.js D:js嚴格模式.js:3 x=1; ^ ReferenceError: x is not defined
如果不是放在第一行沒有進入嚴格模式,結果會是1
嚴格模式有哪些不同不允許未聲明的變量被賦值(見上例)
將拼寫錯轉成異常
"use strict"; // 假如有一個全局變量叫做mistypedVariable mistypedVaraible = 17; // 因為變量名拼寫錯誤,這一行代碼就會拋出 ReferenceError
在嚴格模式下, 試圖刪除不可刪除的屬性時會拋出異常(之前這種操作不會產生任何效果):
"use strict"; delete Object.prototype; // 拋出TypeError錯誤
對象字面量重復屬性名報錯
正常模式下重名屬性是允許的,最后一個重名的屬性決定其屬性值。因為只有最后一個屬性起作用,當代碼是要改變屬性值而卻不是修改的最后一個重名屬性的時候,復制這個對象就產生一連串的bug。在嚴格模式下,重名屬性被認為是語法錯誤:
"use strict"; var o = { p: 1, p: 2 }; // !!! 語法錯誤
嚴格模式禁止八進制數字語法.
測試如下:
!function(){ console.log(0123); //八進制字面量不被允許 }();
報錯信息如下:
$ node 嚴格模式.js D:js嚴格模式.js:19 console.log(0123); //八進制字面量不被允許 ^^^^ SyntaxError: Octal literals are not allowed in strict mode.
禁止使用with語句
因為with語句無法在編譯時就確定,屬性到底歸屬哪個對象。嚴格模式下, 使用 with 會引起語法錯誤, 所以就不會存在 with 塊內的變量在運行是才決定引用到哪里的情況了
"use strict"; var x = 17; with (obj) // !!! 語法錯誤 { // 如果沒有開啟嚴格模式,with中的這個x會指向with上面的那個x,還是obj.x? // 如果不運行代碼,我們無法知道,因此,這種代碼讓引擎無法進行優化,速度也就會變慢。 x; }
eval 獨立作用域
在嚴格模式下 eval 僅僅為被運行的代碼創建變量,eval作用域內不再能夠生成全局變量了,它所生成的變量只能用于eval內部。
var x = 17; var evalX = eval(""use strict"; var x = 42; x"); console.log(x === 17); //true console.log(evalX === 42); //true
嚴格模式禁止刪除聲明變量。delete name 在嚴格模式下會引起語法錯誤:
"use strict"; var x; delete x; `// !!! 語法錯誤
this不再指向全局對象
一個開啟嚴格模式的函數,指定的this不再被封裝為對象,而且如果沒有指定this的話它值是undefined
function fun() { return this; } console.log(fun() === undefined); //true console.log(fun.call(2) === 2); //true console.log(fun.apply(null) === null); //true console.log(fun.call(undefined) === undefined); //true console.log(fun.bind(true)() === true); //true
arguments變為參數的靜態副本
嚴格模式下,函數的 arguments 對象會保存函數被調用時的原始參數。arguments[i] 的值不會隨與之相應的參數的值的改變而變化,同名參數的值也不會隨與之相應的 arguments[i] 的值的改變而變化。
function f(a) { "use strict"; a = 42; return [a, arguments[0]]; } var pair = f(17); console.log(pair); //[ 42, 17 ]參考資料
MDN文檔
阮一峰老師的博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80005.html
摘要:開啟嚴格模式設置對象是一個不可擴展的對象為對象新增屬性張無忌在非嚴格模式下為不可擴展的對象添加新屬性,結果是靜默失敗。 概述 嚴格模式是什么 嚴格模式是JavaScript中的一種限制性更強的變種方式。嚴格模式不是一個子集:它在語義上與正常代碼有著明顯的差異。不支持嚴格模式的瀏覽器與支持嚴格模式的瀏覽器行為上也不一樣,所以不要在未經嚴格模式特性測試情況下使用嚴格模式。嚴格模式可以與非嚴...
摘要:反之亦然非嚴格合并嚴格看起來是非嚴格的。在普通的里面給一個拼寫錯誤的變量名賦值會使全局對象新增一個屬性并繼續工作盡管后面可能出錯在現在的中有可能。第三嚴格模式禁止刪除聲明變量。 文章整理自MSDN:https://developer.mozilla.org... 1.逐步使用嚴格模式 ECMAScript 5的嚴格模式是JavaScript中的一種限制性更強的變種方式。嚴格模式不是一個...
摘要:針對單個函數將放在函數體的第一行,則整個函數以嚴格模式運行。嚴格模式禁止這種用法,全局變量必須顯式聲明。嚴格模式下,這屬于語法錯誤。嚴格模式禁止這種表示法,整數第一位為,將報錯。也就是說,不允許在非函數的代碼塊內聲明函數。 本文轉自【阮一峰博客】:http://www.ruanyifeng.com/blo... 一、概述 除了正常運行模式,ECMAscript 5添加了第二種運行模式:...
嚴格模式 首先來了解一下嚴格模式是什么?嚴格模式是JavaScript中的一種限制性更強的變種方式,不是一個子集:它在語義上與正常代碼有明顯的差異,不支持嚴格模式的瀏覽器與支持嚴格模式的瀏覽器行為上也不一樣,所以不要在未經嚴格模式特性測試情況下使用嚴格模式,嚴格模式可以與非嚴格模式共存,所以腳本可以逐漸的選擇性加入嚴格模式 嚴格模式的目的 首先,嚴格模式會將JavaScript陷阱直接變成明顯的錯...
閱讀 1460·2021-11-22 14:44
閱讀 2843·2021-11-16 11:44
閱讀 3206·2021-10-13 09:40
閱讀 1980·2021-10-08 10:04
閱讀 2363·2021-09-24 10:28
閱讀 2909·2021-09-06 15:02
閱讀 2957·2019-08-30 15:52
閱讀 2392·2019-08-30 13:20