JavaScript 嚴格模式(use strict)

“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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章