Strict mode是JavaScript1.8.5引进的技术,但还没有浏览器确实可靠的实现了严格模式,所以使用时要小心并且多测试。
Strict mode可以应用于整个脚本,也可以适合于单个函数。
在其它所有语句前,放置”use strict”;
把”use strict;放置在函数体的最前面。
简单来说就是把以前JavaScript可以接受的语法问题变成可以抛出来的error。
1. 变量前不加var会抛异常(normal mode, 没有var就是global变量)。
2. 给NaN赋值会抛异常。
3. 给不可写的或只读的属性赋值,或给不可扩展的对象添加新属性,会抛异常。
4. 试图删除不能删除的属性会抛语法异常。
5. 重复的属性定义也会抛语法异常(normal mode, 后面的覆盖前面的)。
6. 方法的参数名重复也会抛语法异常(normal mode, 后面的覆盖前面的)。
7. 禁止使用八进制的语法(normal mode允许)。
1. 禁止使用with语句(normal mode允许)。
2. Eval方法不能引入新的变量(normal mode允许)。
3. 禁止在eval()中删除变量。
1. 不能给eval和arguments这样的名字做绑定或赋值,以下所有的企图都会导致语法错误:
"use strict";
eval = 17;
arguments++;
++eval;
varobj = { set p(arguments) { } };
vareval;
try{ } catch(arguments) { }
functionx(eval) { }
functionarguments() { }
vary = functioneval() { };
varf = newFunction("arguments", "'use strict'; return 17;");
2. Arguments只保存函数被调用时的初始值。给arguments[i]赋值不会再修改相应的函数参数。而在normalmode下,修改相应第一个参数,同时也会修改arguments[0],而修改arguments[0]也同时修改第一个参数。
3. 不再支持arguments.callee。
1. This不再被封装,在normal mode下,this一直是对象。
2. Fun.caller和fun.arguments即不是可以删除的属性,也不能被set或retrieved。
3. Arguments.caller也是不可以删除的属性,也不能set或retrieved。
1. 增加了下列保留字:implements, interface, let,package, private, protected, public, static和yield 。
2. 方法声明应该放在脚本或方法的最前面,不能放在if或for等语句中间。