source
避免偶然创建全局变量
在正常模式下,如果在赋值的时候输错了变量名,会在当前作用域下创建一个变量。在严格模式下会抛出错误。
1 2
| 'use strict'; mistypedVaraible = 17;
|
在正常模式下默默失败的赋值,在严格模式下会抛出异常
例如,NaN
是不可写的全局变量。在正常模式下,赋值给NaN
是无效的,也不会有任何反馈。在严格模式下,将会抛出异常。赋值给不可写变量,只读变量,或者给不可扩展对象添加新的属性在严格模式下都会抛出异常。
1 2 3 4 5 6 7 8 9 10 11 12
| 'use strict'
var obj1 = {}; Object.defineProperty(obj1, 'x', {value: 42, writable: false}); obj1.x = 9;
var obj2 = {get x() {return 17;}}; obj2.x = 5;
var fixed = {}; Object.preventExtensions(fixed); fixed.newProp = 'ohai';
|
删除不可删的属性会报错
1 2
| 'use strict'; delete Object.prorotype;
|
对象属性名必须唯一(es6下可以不唯一)
1 2
| 'use strict'; var o = {p : 1, p: 2};
|
函数参数名必须唯一
1 2 3 4 5
| 'use strict'; function sum(a, a, c) { 'use strict'; return a + b + c; }
|
八进制不可用
with不可用
1 2 3 4 5 6
| 'use strict'; var x = 17; with (obj) { x; }
|
eval不会影响外部作用域
1 2 3 4
| var x = 17; var evalX = eval("'use strict'; var x = 42; x"); console.assert(x === 17); console.assert(evalX === 42);
|
需要注意的是,eval的调用方式也会影响到eval是否在严格模式下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function strict1(str) { 'use strict'; return eval(str); } function strict2(f, str) { 'use strict'; return f(str); } function nonstrict(str) { return eval(str); } strict1("'Strict mode code!'"); strict1("'use strict'; 'Strict mode code!'"); strict2(eval, "'Non-strict code.'"); strict2(eval, "'use strict'; 'Strict mode code!'"); nonstrict("'Non-strict code.'"); nonstrict("'use strict'; 'Strict mode code!'");
|
禁止删除原始类型变量
1 2 3 4 5
| 'use strict'; var x; delete x;
eval("var y; delete y;");
|
eval
和arguments
不可修改,以下操作都是语法错误
1 2 3 4 5 6 7 8 9 10 11
| 'use strict'; eval = 17; arguments++; ++eval; var obj = {set p(arguments) {} }; var eval; try {} catch(arguments) {} function x(eval) {} function arguments() {} var y = function eval() {} var f = new Function('arguments', "'use strict'; return 17;");
|
严格模式下修改参数值不会影响arguments
,修改arguments
也不会影响参数
1 2 3 4 5 6 7 8
| function f(a) { 'use strict'; a = 42; return [a, arguments[0]]; } var pair = f(17); console.assert(pair[0] === 42); console.assert(pair[1] === 17);
|
arguments.callee
不可用
1 2 3
| 'use strict'; var f = function() {return arguments.callee;}; f();
|
this
可以是任意类型的值(在正模式下,this
是对象),而且如果没有指定this
,this
为undefined
1 2 3 4 5 6 7
| 'use strict'; function fun() {return this;} console.assert(fun() === undefined); console.assert(fun.call(2) === 2); console.assert(fun.apply(null) === null); console.assert(fun.call(undefined) === undefined); console.assert(fun.bind(true)() === true);
|