严格模式与非严格模式
TIP
ECMAScript 5引入了严格模式(strict mode)的概念。
严格模式是为javaScript定义了一种不同的解析与执行模型。
在严格模式下,ECMAScript3中的一些不确定的行为将得到处理,而且对某些不安全 的操作也会抛出错误。
要在整个脚本中启用严格模式,可以在js文件顶部添加如下代码:
// js
"use strict";
也可以指定函数在严格模式下执行
function doSomething(){
"use strict";
//函数体
}
严格模式对正常的 JavaScript语义做了一些更改:
- 严格模式通过抛出错误来消除了一些原有静默错误。
- 严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快。
- 严格模式禁用了在ECMAScript的未来版本中可能会定义的一些语法。
详细的一些区别:
禁用
with语法,使用将报错。因为解析with语法时作用域的情况会非常复杂,严重影响代码的解析与运行速度禁止删除变量与函数。delete 变量 或delete 函数都将报错。
属性描述符(propertyDescriptor)相关:
能改变属性描述符的方法有:
Object.defineProperty、Object.defineProperties、Reflect.defineProperty、Reflect.defineProperties、Object.freeze冻结对象的一切属性、Object.seal冻结对象的新增属性,即可以更改已存在的属性的值,和writeable有关,但是无法新增属性。获取一个属性描述符的方法有:
Object.getOwnPropertyDescriptor、Object.getOwnPropertyDecriptors、Reflect.getOwnPropertyDescriptor、Reflect.getOwnPropertyDescriptors- 删除configurable = false的属性会报错
- 给writable = false的属性赋值会报错
- 给不允许扩展的object增加属性会报错
将object设置为不可扩展的方法有:
Object.freeze、Object.seal、Object.preventExtensions、Reflect.freeze、Reflect.seal、Reflect.preventExtensions判断一个object是否允许扩展可以用
Object.isExtensible、Reflect.isExtensible- 定义object时属性重名会报错
- 形参重复时会报错
- eval有独立作用域,eval不能作为变量名或函数名,类似关键字
- arguments是形参的副本(类似浅拷贝),arguments不能作为变量名或函数名,类似关键字
- 禁用caller与callee