严格模式是指使代码在严格条件下运行。如果你在JavaScript脚本的头部看到“use strict”,那么就表明当前处于严格模式下。严格模式主要是为了消除JavaScript语法的一些不合理和怪异之处。
严格模式主要有以下限制:
- 变量必须先声明后使用,且无法删除,不能重复
"use strict"
a = 1; //报错 Uncaught ReferenceError: a is not defined
var b = 1;
delete b;//报错 Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
function foo(p1, p1){} //报错 Uncaught SyntaxError: Duplicate parameter name not allowed in this context
- 不能使用
with
语句
with语句用于暂时修改作用域链,语法如下:
with (Object)
statement
废弃with的主要原因是因为它在引用对象时不可预测,使得代码难以优化,并且还会拖慢代码的执行速度。
- 不能对只读属性赋值,不能删除不可删除的属性
var obj = {};
obj.defineProperty(obj, 'a', {value:1, writable: false});//writable=false使属性不可写
obj.a = 2; //报错 Uncaught TypeError: Cannot assign to read only property 'a' of object '#<Object>'
delete Object.prototype //报错 Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
- 不能使用八进制数和转义字符
var a = 010; //报错 Uncaught SyntaxError: Octal literals are not allowed in strict mode.
var a = 0; //报错 Uncaught SyntaxError: Invalid or unexpected token
-
eval
不能被重新赋值,在作用域 eval() 创建的变量不能被调用
var eval = 1;//报错 Uncaught SyntaxError: Unexpected eval or arguments in strict mode
eval('var a = 1')
console.log(a) //报错 Uncaught ReferenceError: a is not defined
-
arguments
不能被重新赋值,不会自动反映函数参数的变化
var arguments = 1;//报错 Uncaught SyntaxError: Unexpected eval or arguments in strict mode
- 禁止this指向全局对象
在严格模式下,顶层this
指向undefined
,而不再指向全局对象。
function foo1(){
return this; //返回Window对象
}
function foo2(){
"use strict";
return this; //返回undefined
}
- 不能使用
arguments.callee
和arguments.caller
arguments.callee
通常用在函数的递归调用中,废弃的原因主要是因为它在每次递归调用时都需要重新创建,不仅影响性能,还会影响闭包。详细说明可以查看MDN文档。arguments.caller
属性用在函数执行的时候调用自身。废弃的原因是因为其潜在的不安全性。 - 不能使用
fn.caller
和fn.arguments
获取函数调用的堆栈fn.caller
返回的是函数的调用者,当一个函数fn在全局作用域内被调用时,fn.caller
为null
,当一个函数fn在另外一个函数作用域内被调用的,fn.caller
则指向调用它的那个函数。fn.arguments
代表传入函数的实参,已被废弃,可以使用函数内部的arguments
对象代替。
详细可参见MDN文档。 - 增加了保留字,包括
public
、private
、protected
、static
、let
、yield
、package
、interface
、implements
。
"use strict"
指令只允许出现在脚本或函数的开头,并且在ES6的模块中自动采用严格模式。
不管是否使用严格模式,都应该按照严格模式的标准来书写代码,这样可使得代码更加安全、稳定。