天天看點

JavaScript嚴格模式嚴格模式

文章目錄

  • 嚴格模式
    • 使用"use strict"指令
    • 為什麼使用嚴格模式?
    • 嚴格模式的限制

嚴格模式

嚴格模式就是在嚴格的條件下運作

使用"use strict"指令

"use strict"指令在ES5中增加的。

他不是一個語句,但是是一個字面量表達式,向後相容。

嚴格模式下你不能使用未聲明的變量。

"use strict"指令隻允許出現在腳本或者函數的開頭

為什麼使用嚴格模式?

消除JavaScript文法的一些不合理、不嚴謹之處,減少一個怪異行為。

  • 消除代碼運作的一些不安全之處,保證代碼運作的安全;
  • 提高編譯器效率,增加運作速度;
  • 為未來新版本的JavaScript做好鋪墊

"嚴格模式"展現了JavaScript更合理、更安全、更嚴謹的發展方向,包括微軟的IE10都已經支援它。

另一方面,同樣的代碼。在嚴格模式下,可能會有不一樣的運作結果,一些正常模式下的運作的語句,可能在嚴格模式下不能運作。

嚴格模式的限制

1.不允許使用未聲明的變量

"use strict";
x = 3.14;   // ReferenceError
           

2.不允許删除變量或對象

"use strict"

var x = 3.14;
delete x  // SyntaxError: Delete of an unqualified identifier in strict mode.
           

3.不允許删除函數

"use strict"

function f() {
    return 1;
}
delete f  //SyntaxError: Delete of an unqualified identifier in strict mode.
           

4.不允許變量重名

"use strict"

function f(x,x) {  // SyntaxError: Duplicate parameter name not allowed in this context
    return 1;
}
           

5.不允許使用不标準的八進制表示法

"use strict"

var x = 012  //SyntaxError: Octal literals are not allowed in strict mode.
           

6.不允許使用轉義字元

"use strict"

var x = "\012";  //SyntaxError: Octal escape sequences are not allowed in strict mode.
           

7.不允許隻讀屬性指派

"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});

obj.x = 3.14;  // TypeError: Cannot assign to read only property 'x' of object '#<Object>'

           

8.不允許對一個shiyo-nggetter方法讀取的屬性指派

"use strict";
var obj = {get x() {return 0} };

obj.x = 3.14;  // Cannot set property x of #<Object> which has only a getter
           

9.不允許删除一個不允許删除的屬性

"use strict";
delete Object.prototype; // TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
           

10.由于一個安全原因,在作用域eval()建立的變量不能被調用

"use strict";

eval("var x = 2");
console.log(x);  //ReferenceError: x is not defined

           

11.不允許出現下面這種語句

"use strict";
with (Math){x = cos(2)};  // SyntaxError: Strict mode code may not include a with statement
           

12.以下關鍵字不能作為變量名

  • arguments
  • eval
  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield

更多保留關鍵字

繼續閱讀