javascript之嚴格模式

阮一峯的網絡日誌——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未聲明

靜態綁定

禁止使用with語句

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

創設eval做用域

正常模式下,javascript語言有兩種變量做用域(scope):全局做用域和函數做用域,嚴格模式創設了第三種做用域:eval做用域
嚴格模式下,eval做用域中生成的變量只能用於內部函數

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

加強的安全措施

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

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; // 語法錯誤

arguments對象的限制

不容許對arguments賦值

"use strict";
arguments++;//錯誤
var obj = { set p(arguments) { } }; // 語法錯誤
try { } catch (arguments) { } // 語法錯誤
function arguments() { } // 語法錯誤
var f = new Function("arguments", "'use strict'; return 17;"); // 語法錯誤

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]

禁止使用arguments.callee

沒法在匿名函數內部調用自身

"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

相關文章
相關標籤/搜索