严格模式下,保留字不能作为变量名存在。
// 严格模式下报错,Unexpected strict mode reserved word
'use strict';
var let;
// 非严格模式下不报错
var let;
严格模式下函数内部的this指向为undefined,而非严格模式下默认指向全局对象window,或者global(在node中时)。
// 严格模式下返回true
'use strict';
(function(){
return this === undefined;
}).call();
// 非严格模式下返回true
(function(){
return this === window;
}).call();
严格模式下,在简单的方法里this可以不必是一个对象。
// 均返回true
'use strict';
(function(){ return typeof this === 'string' }).call('');
(function(){ return typeof this === 'number' }).call(1);
(function(){ return typeof this === 'boolean' }).call(true);
严格模式下,八进制的字面量是不被允许的。
// Uncaught SyntaxError: Octal literals are not allowed in strict mode.
'use strict';
010
严格模式下,对未声明的变量赋值会报错。
// 严格模式下报错,__i_dont_exist is not defined
'use strict';
__i_dont_exist = 1;
// 非严格模式下不报错
__i_dont_exist = 1;
严格模式下,对eval或arguments赋值会报错。
// 严格模式下报错
// Uncaught SyntaxError: Unexpected eval or arguments in strict mode
'use strict';
eval = 1;
arguments = 1;
严格模式下,对不可写的属性赋值会报错。
// Uncaught TypeError: Cannot assign to read only property 'x' of object '#<Object>'
'use strict';
Object.defineProperty({},"x",{ writable: false }).x = 1;
严格模式下eval和arguments不可被作为变量使用。
// Uncaught SyntaxError: Unexpected eval or arguments in strict mode.
'use strict';
var eval;
var arguments;
严格模式下的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);
严格模式下caller和arguments不可被访问。
// Uncaught TypeError: 'caller' and 'arguments' are restricted function properties and cannot be accessed in this context.
'use strict';
(function(){}).caller;
严格模式下arguments和传入的参数无法映射。
// 结果返回true
'use strict';
(function(x){
arguments[0] = 2;
return x === 1;
})(1);
严格模式下eval函数无法声明变量。
// Uncaught ReferenceError: __some_unique_variable is not defined
'use strict'
eval('var __some_unique_variable = 1;');
console.log(__some_unique_variable);
严格模式下,禁止删除变量,除非变量的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;
严格模式下不可以删除不可配置的属性。
// Uncaught TypeError: Cannot delete property 'prototype' of function Object()
'use strict'
delete Object.prototype;
严格模式下禁止使用with语句。
// Uncaught SyntaxError: Strict mode code may not include a with statement
'use strict'
with({}){}
严格模式下,重复的参数名称会报错。
// Uncaught SyntaxError: Duplicate parameter name not allowed in this context
'use strict'
function f(x, x) { }
严格模式下,函数表达式中拥有一致的函数名和参数名,是被允许的。
在node中,必须要在严格模式下才能使用let、const等特性,但在浏览器中即使不在严格模式下也是可以使用的。