JavaScript嚴格模式說明帶示例

嚴格模式(use strict)

目的

  1. 消除JS中一些不合理、不嚴謹之處,減小一些怪異行爲
  2. 消除代碼中的一些不安全之處,保障代碼運行安全
  3. 提升編譯器效率,增長運行速度
  4. 爲之後的JS新規範作鋪墊

兼容性

FF、Chrome、IE10+、Safari、Operajavascript

語法

"use strict";
老版本瀏覽器將以上源碼當作字符串處理java

使用範圍

  1. 在整個腳本以前調用,整段腳本以嚴格模式執行
<script>
    "use strict";
    console.log('全局嚴格模式');
    </script>
  1. 在函數內部以前調用,整個函數以嚴格模式執行
function fn() {
        "use strict";
        console.log('局部嚴格模式,只在函數內有效');
    }

對行爲和語法的控制

  1. 全局變量顯示聲明
    • 正常模式下,變量沒有聲明,直接賦值,默認爲全局變量;
    • 嚴格模式禁止這種行爲,全局變量必須用var顯式聲明
    //正常模式下
     a = 1;
     console.log(a);//1
    //嚴格模式下
     "use strict";
     a = 1;
     console.log(a);//報錯
  2. 禁止使用with
    width語句在編譯時沒法肯定屬性歸屬於哪一個對象
  3. 增長eval做用域
    • 正常模式下,eval中執行的做用於取決於它處於全局仍是函數做用域內;
    • 嚴格模式下,eval自己有獨立的做用域
    //正常模式下
     var a = 1;
     console.log(eval('var a = 1;a'));//2
     console.log(a);//2
    //嚴格模式下
     var a = 1;
     console.log(eval('var a = 2;a'));//2
     console.log(a);//1
  4. this默認不指向全局對象window
    • 正常模式下,this指向window
    • 嚴格模式下,this再也不默認指向window
    //正常模式下
     function fn() {
         this.a = 1;
     }
     fn();
     a;//1
    //嚴格模式下
     "use strict";
     function fn() {
         this.a = 1;
     }
     fn();
     a;//報錯
  5. argumentscaller被禁用
    • 正常模式下,函數自己擁有默認屬性arguments指向傳遞的參數,caller指向函數引用;
    • 嚴格模式下,argumentscaller被禁用,報錯
  6. 禁止刪除變量
    • 正常模式下,delete能夠刪除定義的變量;
    • 嚴格模式下,只有configurabletrue的對象屬性才能被刪除,var定義的變量不能被刪除
    //正常模式下
     var a = 1;
     delete a;//a不會被刪除,也不報錯
     a;//1
     var obj = {
         o1: 1,
         o2: 2
     };
     delete obj.o1;//obj中o1屬性被刪除
     obj.o1;//undefined;
    //嚴格模式下
     "use strict";
     var a = 1;
     delete a;//報錯
     a;//1
     var obj = {
         o1: 1,
         o2: 2
     };
     delete obj.o1;
     obj.o1;//undefined;
  7. 對只讀屬性賦值,會報錯
    • 正常模式下,對只讀屬性賦值時,不報錯,只默認失敗;
    • 嚴格模式下,報錯
  8. getter方法賦值報錯
  9. 對禁止擴展的對象添加新屬性報錯
  10. 刪除不可刪除的屬性報錯
  11. 對象不能有重名屬性
    • 正常模式下,對象中重名屬性會被後面的重名屬性覆蓋;
    • 嚴格模式下,語法錯誤,不會報錯
  12. 函數不能有重名參數
    • 正常模式下,函數下有重名參數時,正常輸出參數,重名參數被後面的重名參數覆蓋,使用arguments輸出時,可區分參數值;
    • 嚴格模式下,報錯
    //正常模式下
    function fn(a, a, b) {
        console.log(a);
        console.log(arguments[0]);
        console.log(arguments[1]);
    }
    fn(1,2,3);//2 1 2
    //嚴格模式下
    "use strict";
    function fn(a, a, b) {
        console.log(a);
        console.log(arguments[0]);
        console.log(arguments[1]);
    }
    fn(1,2,3);//報錯
  13. 禁用八進制
    • 正常模式下,整數第一位若是是0,表示八進制,可正常轉換輸出對應的十進制數;
    • 嚴格模式下,報錯
    //正常模式下
    console.log(012);//10
    //嚴格模式下
    'use strict';
    console.log(012);//報錯
  14. 不容許對arguments賦值
    • 正常模式下,可對arguments從新賦值;
    • 嚴格模式下,語法錯誤,參數值不會變
  15. 再也不對arguments跟蹤變化
    • 正常模式下,函數參數值發生變化時,arguments也隨之變化;
    • 嚴格模式下,不變
    //正常模式下
    function fn(a, b, c) {
        arguments[1] = 4;
        console.log(a, b, c);//1, 4, 3
        console.log(arguments[1]);//4
    }
    fn(1, 2, 3);
    //嚴格模式下
    'use strict';
    function fn(a, b, c) {
        arguments[1] = 4;
        console.log(a, b, c);//1, 2, 3
        console.log(arguments[1]);//4
    }
    fn(1, 2, 3);
  16. arguments.callee被禁用
    • 正常模式下,arguments.callee指向函數引用;
    • 嚴格模式下,被禁用,報錯
    //正常模式下
    function fn(a) {
        console.log(arguments.callee);
    }
    fn(1);//輸出原函數體
    //嚴格模式下
    'use strict';
    function fn(a) {
        console.log(arguments.callee);
    }
    fn(1);//報錯
  17. 函數必須被聲明在頂層
    • 正常模式下,函數能夠被聲明在iffor代碼塊內;
    • 嚴格模式下,不容許,報錯
    //正常模式下
    if(true) {
        function fn(a) {
            console.log(a);
        }
    }
    fn(1);//1
    //嚴格模式下
    'use strict';
    if(true) {
        function fn(a) {
            console.log(a);
        }
    }
    fn(1);//報錯,函數不存在
  18. 新增保留字
    • 嚴格模式下,新增關鍵字implementsinterfaceletpackageprivateprotectedpublicstaticyield
相關文章
相關標籤/搜索