Strict mode

reserved words

严格模式下,保留字不能作为变量名存在。

// 严格模式下报错,Unexpected strict mode reserved word
'use strict';
var let;     

// 非严格模式下不报错  
var let;

"this" is undefined in functions

严格模式下函数内部的this指向为undefined,而非严格模式下默认指向全局对象window,或者global(在node中时)。

// 严格模式下返回true  
'use strict';
(function(){ 
    return this === undefined; 
}).call();    

// 非严格模式下返回true  
(function(){ 
    return this === window; 
}).call();

"this" is not coerced to object in primitive methods

严格模式下,在简单的方法里this可以不必是一个对象。

// 均返回true  
'use strict';
(function(){ return typeof this === 'string' }).call('');
(function(){ return typeof this === 'number' }).call(1);
(function(){ return typeof this === 'boolean' }).call(true); 

egacy octal is a SyntaxError

严格模式下,八进制的字面量是不被允许的。

// Uncaught SyntaxError: Octal literals are not allowed in strict mode.
'use strict';
010

assignment to unresolvable identifiers is a ReferenceError

严格模式下,对未声明的变量赋值会报错。

// 严格模式下报错,__i_dont_exist is not defined
'use strict';  
__i_dont_exist = 1;  

// 非严格模式下不报错  
__i_dont_exist = 1;   

assignment to eval or arguments is a SyntaxError

严格模式下,对eval或arguments赋值会报错。

// 严格模式下报错   
// Uncaught SyntaxError: Unexpected eval or arguments in strict mode  
'use strict';
eval = 1;
arguments = 1;   

assignment to non-writable properties is a TypeError

严格模式下,对不可写的属性赋值会报错。

// Uncaught TypeError: Cannot assign to read only property 'x' of object '#<Object>'
'use strict';
Object.defineProperty({},"x",{ writable: false }).x = 1;  

eval or arguments bindings is a SyntaxError

严格模式下eval和arguments不可被作为变量使用。

// Uncaught SyntaxError: Unexpected eval or arguments in strict mode.  
'use strict';
var eval;
var arguments;

arguments.caller and arguments.callee is a TypeError

严格模式下的arguments不会再提供访问与调用这个函数相关的变量的途径。

// Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
'use strict';
function fun(a, b){
    return arguments.caller;
}
fun(1,2);  

(function(){}).caller and (function(){}).arguments is a TypeError

严格模式下caller和arguments不可被访问。

// Uncaught TypeError: 'caller' and 'arguments' are restricted function properties and cannot be accessed in this context.   
'use strict';
(function(){}).caller;

arguments is unmapped

严格模式下arguments和传入的参数无法映射。

// 结果返回true
'use strict';
(function(x){
  arguments[0] = 2;
  return x === 1;
})(1);  

eval() can't create bindings

严格模式下eval函数无法声明变量。

// Uncaught ReferenceError: __some_unique_variable is not defined
'use strict'
eval('var __some_unique_variable = 1;');
console.log(__some_unique_variable);  

deleting bindings is a SyntaxError

严格模式下,禁止删除变量,除非变量的configurable设置为true。

// Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
'use strict';
var x;
delete x;  

// 删除成功  
'use strict';
var o = Object.create(null, {'x': {
    value: 1,
    configurable: true
}});
delete o.x;

deleting non-configurable properties is a TypeError

严格模式下不可以删除不可配置的属性。

// Uncaught TypeError: Cannot delete property 'prototype' of function Object()  
'use strict'
delete Object.prototype;  

"with" is a SyntaxError

严格模式下禁止使用with语句。

// Uncaught SyntaxError: Strict mode code may not include a with statement  
'use strict'
with({}){}  

repeated parameter names is a SyntaxError

严格模式下,重复的参数名称会报错。

// Uncaught SyntaxError: Duplicate parameter name not allowed in this context  
'use strict'
function f(x, x) { }

function expressions with matching name and argument are valid

严格模式下,函数表达式中拥有一致的函数名和参数名,是被允许的。

node、浏览器中严格模式的差异

在node中,必须要在严格模式下才能使用let、const等特性,但在浏览器中即使不在严格模式下也是可以使用的。