简单整理一下js严格模式下的变化。整理来源MDN
部分代码测试环境:Chrome 76.0.3809.132
将过失错误转成异常
- 严格模式下无法再意外创建全局变量。
"use strict";
mistypedVaraible = 17; // 这一行代码就会抛出 ReferenceError。不可以不写声明
- 严格模式下会使引起静默失败的赋值操作抛出异常。(包括但不限于,给不可写属性赋值,给只读属性赋值,给不可扩展对象的新属性赋值)
- 试图删除不可删除属性时会抛出异常(之前这种操作不会产生任何效果)
- Gecko在版本34之前,严格模式下一个对象内的属性重名会报错。现在已经修复,即在严格模式下可以重名。
- 严格模式下要求函数的参数名唯一。
- 严格模式下禁止使用八进制数字语法。
- ECMAScript 6中的严格模式禁止对primitive(目前(第三阶段)新增加了bigInt基础类型)类型设置属性
简化变量的使用
- 禁用with
- 严格模式下的 eval 不再为上层范围(surrounding scope,注:包围eval代码块的范围)引入新变量
= 严格模式禁止删除变量声明。(注:依然可删除对象属性)
让eval和arguments变的简单
- 名称eval和arguments不能通过程序语法被绑定或赋值
- 严格模式下,参数的值不会随着arguments对象的值的改变而改变。
- 不再支持arguments.callee
“安全的”Javascript
- 在严格模式下通过this传递给一个函数的值不会被强制转换为一个对象
- 在严格模式中再也不能通过广泛实现的ECMAScript扩展“游走于”JavaScript的栈中。如果fun在严格模式下,那么fun.caller和fun.arguments都是不可删除的属性而且在存值、取值时都会报错
- 严格模式下的arguments不会再提供访问与调用这个函数相关的变量的途径。
为未来的ECMAScript版本铺平道路
- 在严格模式中一部分字符变成了保留的关键字。这些字符包括implements, interface, let, package, private, protected, public, static和yield。
- 严格模式禁止了不在脚本或者函数层面上的函数声明
浏览器的严格模式
主流浏览器现在实现了严格模式。但是不要盲目的依赖它,因为市场上仍然有大量的浏览器版本只部分支持严格模式或者根本就不支持(比如IE10之前的版本)。严格模式改变了语义。依赖这些改变可能会导致没有实现严格模式的浏览器中出现问题或者错误。谨慎地使用严格模式,通过检测相关代码的功能保证严格模式不出问题。最后,记得在支持或者不支持严格模式的浏览器中测试你的代码。如果你只在不支持严格模式的浏览器中测试,那么在支持的浏览器中就很有可能出问题,反之亦然。