阮一峯的網絡日誌——Javascript嚴格模式詳解javascript
消除javascript語法的一些不合理、不嚴謹之處,減小一些怪異行爲;html
消除代碼運行的一些不安全之處,保證代碼運行的安全;java
提升編譯器效率,增長運行速度;安全
爲將來版本的JavaScript作好鋪墊網絡
<script> "use strict"; //code here </script> (function(){ "use strict"; //code here })();
"use strict" v=1; //報錯,v未聲明 for(i=0;i<2;i++){ }//報錯,i未聲明
"use strict" var v=1; with(o){ v=2; }//語法錯誤
正常模式下,javascript語言有兩種變量做用域(scope):全局做用域和函數做用域,嚴格模式創設了第三種做用域:eval做用域
嚴格模式下,eval做用域中生成的變量只能用於內部函數
「use strict」; var x=2; console.info(eval("var x=5;x")); //5 console.info(x);//2
function f(){ return !this; }//false function f(){ "use strict"; return !this; }//true,嚴格模式下this的值爲undefined,!this的值爲true function f(){ "use strict"; this.a = 1; }; f();//報錯,this未定義 只能使用new f(),將this的指向明確的對象
function f1(){ "use strict"; f1.caller; //報錯 f1.arguments;//報錯 }
嚴格模式下沒法刪除變量,只有configurable設置爲true的對象屬性,才能被刪除this
"use strict"; var x; delete x; //語法錯誤 var o = Object.create(null, { 'x':{value:1,configurable:true} }); delete o.x; //刪除成功
正常模式下,對一個對象的只讀屬性進行賦值,不會報錯,嚴格模式會日誌
"use strict"; var o = {}; Object.defineProperty(o, {value:1, writable:false}); o.v = 2; //報錯
嚴格模式下,對一個使用getter方法讀取的屬性進行賦值,會報錯code
"use strict"; var o ={ get v(){return 1;} }; o.v = 2; //報錯
嚴格模式下,對禁止擴展的對象添加新屬性,會報錯htm
"use strict"; var o ={}; Object.preventExtensions(o); o.v = 2; //報錯
"use strict"; var o = { p:1, p:2 };//語法錯誤
"use strict"; function f(a, a, b) { // 語法錯誤 return ; }
正常模式下,整數的第一位若是是0,表示這是八進制數,好比0100等於十進制的64。嚴格模式禁止這種表示法,整數第一位爲0,將報錯。
"use strict"; var n = 0100; // 語法錯誤
"use strict"; arguments++;//錯誤 var obj = { set p(arguments) { } }; // 語法錯誤 try { } catch (arguments) { } // 語法錯誤 function arguments() { } // 語法錯誤 var f = new Function("arguments", "'use strict'; return 17;"); // 語法錯誤
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]
沒法在匿名函數內部調用自身
"use strict"; var f = function(){ return arguments.callee;}; f(); //報錯
"use strict"; if (true) { function f() { } // 語法錯誤 } for (var i = 0; i < 5; i++) { function f2() { } // 語法錯誤 }
新增的一些保留字:implements
, interface
, let
, package
, private
, protected
, public
, static
, yield
。