严格模式
严格模式是采用具有限制性 JavaScript 变体的一种方式。
启用严格模式
js
"use strict"; // 整个脚本都开启严格模式的语法
js
function strict() {
// 函数级别严格模式语法
'use strict';
}
在严格模式中运行非严格模式的代码,可能报错。因此推荐使用函数级别严格模式。
严格模式的改变
将问题直接转化为错误
- 未定义的变量,不再创建为全局变量
- 不可写属性、只读属性、不可扩展对象新属性赋值,不再静默失败
- 删除不可删除的属性,不再静默失败
- 定义对象时出现重名属性,报语法错误
- 函数的参数名出现重名,报语法错误
- 禁止八进制数字语法。如
017
表示15 - 禁止设置基本类型的属性。如
false.val = ''
编译器优化
通过禁用JavaScript的部分灵活功能来方便编译器优化代码:
- 禁用
with
eval
不会使得内部定义影响到eval
外部变量- 禁止删除仅声明但未定义变量
eval
、arguments
像保留字一样,不可任意使用- 禁用
arguments.callee
更安全
this
不做类型转换,没有指定时默认值为undefined
- 禁用
fn.arguments
、fn.caller
- 禁用
arguments.caller
为未来版本增加保留字
在严格模式下,不能再用这些名字作为变量名或者形参名:
- implements
- interface
- let
- package
- private
- protected
- public
- static
- yield
禁止任意位置的函数声明
js
"use strict";
if (true) {
function f() { } // !!! 语法错误
f();
}
for (var i = 0; i < 5; i++) {
function f2() { } // !!! 语法错误
f2();
}
function foo() { // 合法
function bar() { } // 同样合法
}