严格模式
严格模式就是在严格的条件下运行
使用"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
更多保留关键字