前言
es5 的严格模式是采用具有限制性 JavaScript 变体的一种方式, 从而使代码显示地脱离'懒散模式 / 非严格模式'
严格模式
严格模式通过抛出错误来消除一些原有静默错误
严格模式修复了一些导致 JavaScript 引擎难以优化的缺陷: 有时候, 相同的代码, 严格模式可以比非严格模式下运行得更快.
严格模式禁用了在 ECMAScript 未来版本中可能会定义的一些语法.
开启严格模式
在整个脚本文件或者函数体开头, 写入'use strict'语句.
将拼写错误转成异常
无法再意外创建全局变量, 会抛出错误. ReferenceError.: *** is not defined
引起静默失败的赋值操作抛出异常. TypeError: ...
试图删除不可删除的属性时会抛出异常. TypeError: ...
要求函数的参数名唯一. SyntaxError: Duplicate parameter name not allowed in this context
禁止八进制数字语法. SyntaxError: Octal literals are not allowed in strict mode.
禁止设置原始类型值的属性. TypeError: ...
简化变量的使用
禁用 with
eval 不再为上层范围引入新变量.
在严格模式下 eval 仅仅为被运行的代码创建变量. 所以 eval 不会使得名称映射到外部变量或者其他局部变量.
禁止删除声明变量. delete name 在严格模式下会引起语法错误. SyntaxError: Delete of an unqualified identifier in strict mode.
让 eval 和 arguments 变的简单
eval 和 arguments 不能通过程序语法被绑定赋值.
参数的值不会随 arguments 对象的值的改变而变化.
不再支持 argument.callee
"安全的"JavaScript
通过 this 传递给一个函数的值不会被强制转换为一个对象.
再也不能通过广泛实现的 ECMAScript 扩展 "游走于"JavaScript 的栈中.
函数的参数不在提供对相应函数调用变量的访问.
为未来的 ECMAScript 版本铺平道路
保留了一部分字符作为关键字. 比如 implements,interface,let,package,private,protected,public,static 和 yield
禁止了不在脚本或者函数层面上的函数声明
浏览器的严格模式
主流浏览器现在实现了严格模式. 但是也有大量浏览器只支持部分严格模式或者根本就不支持, 所以不要盲目依赖严格模式.
参考 MDN https://developer.mozilla.org/zh-CN/
来源: https://www.cnblogs.com/weiqinl/p/9563266.html