"use strict"詳解
阿新 • • 發佈:2017-09-02
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"詳解