3.1.0 JS 严格模式
为脚本开启严格模式节
为整个脚本文件开启严格模式,需要在所有语句之前放一个特定语句 "use strict";
(或 'use strict';
)
// 整个脚本都开启严格模式的语法
"use strict";
var v = "Hi! I'm a strict mode script!";
1
2
3
2
3
为函数开启严格模式节
同样的,要给某个函数开启严格模式,得把 "use strict";
(或'use strict';
)声明一字不漏地放在函数体所有语句之前。
function strict(){
// 函数级别严格模式语法
'use strict';
function nested() { return "And so am I!"; }
return "Hi! I'm a strict mode function! " + nested();
}
function notStrict() { return "I'm not strict."; }
1
2
3
4
5
6
7
2
3
4
5
6
7
js 严格模式 'use strict'
- 设立"严格模式"的目的,主要有以下几个:
- 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的Javascript做好铺垫。
严格模式中的变化
- 严格模式下无法再意外创建全局变量: 严格模式中意外创建全局变量被抛出错误替代
- 严格模式会使引起静默失败(silently fail,注:不报错也没有任何效果)的赋值操抛出异常
- 在严格模式下, 试图删除不可删除的属性时会抛出异常
- 在Gecko版本34之前,严格模式要求一个对象内的所有属性名在对象内必须唯一
- 严格模式要求函数的参数名唯一
- 严格模式禁止八进制数字语法
- ECMAScript 6中的严格模式禁止设置primitive值的属性
简化变量的使用
- 严格模式禁用 with.
- 严格模式下的 eval 不再为上层范围(surrounding scope,注:包围eval代码块的范围)引入新变量.
- 严格模式禁止删除声明变量
- 严格模式让arguments和eval少了一些奇怪的行为
- 严格模式下,参数的值不会随 arguments 对象的值的改变而变化
- 不再支持 arguments.callee。正常模式下,arguments.callee 指向当前正在执行的函数。(这意味着,你无法在匿名函数内部调用自身了。)