“use strict” 指令在 JavaScript 1.8.5 (ECMAScript5) 中新增。
它不是一條語句,但是是一個字面量表達式,在 JavaScript 舊版本中會被忽略。
“use strict” 的目的是指定代碼在嚴格條件下執行。
支持嚴格模式的瀏覽器:Internet Explorer 10+、 Firefox 4+、Chrome 13+、 Safari 5.1+、 Opera 12+。
聲明嚴格模式
通過在腳本或函數的開頭添加 “use strict”; 來聲明嚴格模式。
在腳本開頭進行聲明,擁有全局作用域(腳本中的所有代碼均以嚴格模式來執行)。
在函數中聲明嚴格模式,擁有局部作用域(只有函數中的代碼以嚴格模式執行)。
爲什麼使用嚴格模式?
- 消除 JavaScript 語法的一些不合理、不嚴謹之處,減少一些怪異行爲;
- 消除代碼運行的一些不安全之處,保證代碼運行的安全;
- 提高編譯器效率,增加運行速度;
- 爲未來新版本的 JavaScript 做好鋪墊。
注意: 現在網站的 JS 都會進行壓縮,一些文件用了嚴格模式,而另一些沒有。這時這些本來是嚴格模式的文件,被 merge 後,這個串就到了文件的中間,不僅沒有指示嚴格模式,反而在壓縮後浪費了字節。
嚴格模式中不允許的事項
- 不允許使用未聲明的變量。對象也是變量,在不聲明對象的情況下使用對象也是不允許的。
"use strict"; x = 3.14;// 報錯 "use strict"; x = {p1:10, p2:20};// 報錯
- 不允許刪除變量或對象。
"use strict"; var x = 3.14; delete x;// 報錯
- 不允許刪除函數。
"use strict"; function x(p1, p2) {}; delete x;// 報錯
- 不允許重複參數名。
"use strict"; function x(p1, p1) {};// 報錯
- 不允許使用八進制。
"use strict"; var x = 010;// 報錯
- 不允許使用轉義字符。
"use strict"; var x = \010;// 報錯
- 不允許對只讀屬性賦值。
"use strict"; var obj = {}; Object.defineProperty(obj, "x", {value:0, writable:false}); obj.x = 3.14;// 報錯
- 不允許對一個使用 getter 方法讀取的屬性進行賦值。
"use strict"; var obj = {get x() {return 0} }; obj.x = 3.14;// 報錯
- 不允許刪除一個不可刪除的屬性。
"use strict"; delete Object.prototype; // 報錯
- 變量名不能使用 “eval” 字符串。
"use strict"; var eval = 3.14;// 報錯
- 變量名不能使用 “arguments” 字符串。
"use strict"; var arguments = 3.14;// 報錯
with
語句是不允許的。"use strict"; with (Math){x = cos(2)};// 報錯
- 出於安全考慮,在作用域 eval() 創建的變量不能被調用。
"use strict"; eval ("var x = 2"); alert (x);// 報錯
- 在函數體中,this 的值是全局對象。在嚴格模式中,this 的值是 undefined。
function f(){ return !this; } // 返回false,因爲"this"指向全局對象,"!this"就是false function f(){ "use strict"; return !this; } // 返回true,因爲嚴格模式下,this的值爲undefined,所以"!this"爲true。
保留關鍵字
爲了向將來 JavaScript 的新版本過渡,嚴格模式新增了一些保留關鍵字。嚴格模式中不允許使用爲未來預留的關鍵字做變量名或函數名。
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
參考
- https://www.runoob.com/js/js-strict.html
- https://www.w3school.com.cn/js/js_strict.asp
- https://blog.csdn.net/weixin_40387601/article/details/80514358