天天看点

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

更多保留关键字

继续阅读