1. 程式人生 > >"use strict"詳解

"use strict"詳解

null this .info 版本 變化 屬性 表示法 追蹤 遍歷

參考:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html

目的:

  • 消除JavaScript語法的一些不合理、不嚴謹之處,減少一些怪異行為;
  • 消除代碼運行的一些不安全之處,保證代碼運行的安全;
  • 提高編譯器效率,增加運行速度;
  • 為未來新版本的JavaScript做好鋪墊。

行為:

全局變量必須顯示聲明

"use strict"
    v = 1  // 報錯,v未聲明
    for(i = 0;i<2;i++){   //報錯,i未聲明
}

禁止使用with語句

因為with語句無法在編譯時就確定,屬性到底歸屬哪個對象。

"use strict";
  
var v = 1;   with (o){ // 語法錯誤     v = 2;   }

創設eval作用域

 "use strict";
  var x = 2;
  console.info(eval("var x = 5; x")); // 5
  console.info(x); // 2    

禁止this關鍵字指向全局對象

  function f(){
    return !this;
  } 
  // 返回false,因為"this"指向全局對象,"!this"就是false
  function f(){ 
    "use strict";
    return !this
;   }   // 返回true,因為嚴格模式下,this的值為undefined,所以"!this"為true。
  function f(){
    "use strict";
    this.a = 1;
  };
  f();// 報錯,this未定義

禁止在函數內部遍歷調用棧

  function f1(){
    "use strict";
    f1.caller; // 報錯
    f1.arguments; // 報錯
  }
  f1();

禁止刪除變量

嚴格模式下無法刪除變量。只有configurable設置為true的對象屬性,才能被刪除。

  "use strict";
  
var x;   delete x; // 語法錯誤   var o = Object.create(null, {‘x‘: {       value: 1,       configurable: true   }});   delete o.x; // 刪除成功

對象不能有重名的屬性 函數不能有重名的參數

  "use strict";
  var o = {
    p: 1,
    p: 2
  }; // 語法錯誤

  function f(a, a, b) { // 語法錯誤
    return ;
  }

禁止八進制表示法

  "use strict";
  var n = 0100; // 語法錯誤

不允許對arguments賦值 arguments不再追蹤參數的變化 禁止使用arguments.callee(已被ES5拋棄)

  function f(a){
            "use strict"
             arguments++;  // 語法錯誤
    }
    function f(a) {
    a = 2;
    return [a, arguments[0]];
  }
  f(1); // 正常模式為[2,2]
  function f(a) {
    "use strict";
    a = 2;
    return [a, arguments[0]];
  }
  f(1); // 嚴格模式為[2,1]    

保留字

  function package(protected) { // 語法錯誤

    "use strict";

    var implements; // 語法錯誤

  }

"use strict"詳解