1. 严格模式
ECMAScript 5的严格模式是采用具有限制性 JavaScript 变体的一种方式,从而使代码隐式地脱离“马虎模式/稀松模式/懒散模式“(sloppy)模式。严格模式不仅仅是一个子集:它的产生是为了形成与正常代码不同的语义。不支持严格模式与支持严格模式的浏览器在执行严格模式代码时会采用不同行为。所以在没有对运行环境展开特性测试来验证对于严格模式相关方面支持的情况下,就算采用了严格模式也不一定会取得预期效果。严格模式代码和非严格模式代码可以共存,因此项目脚本可以渐进式地采用严格模式。严格模式对正常的 JavaScript 语义做了一些更改。
- 严格模式通过抛出错误来消除了一些原有静默错误。
- 严格模式修复了一些导致 JavaScript 引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快。
- 严格模式禁用了在 ECMAScript 的未来版本中可能会定义的一些语法。
2. 开调用严格模式
为整个脚本文件开启严格模式,需要在所有语句之前放一个特定语句 "use strict";
(或 'use strict';
)
// 整个脚本都开启严格模式的语法
"use strict";
var v = "Hi! I'm a strict mode script!";
3. 严格模式变化
在严格模式下,某些先前被接受的过失错误将会被认为是异常。JavaScript 被设计为能使新人开发者更易于上手,所以有时候会给本来错误操作赋予新的不报错误的语义 (non-error semantics). 有时候这可以解决当前的问题,但有时候却会给以后留下更大的问题。严格模式则把这些失误当成错误,以便可以发现并立即将其改正。
- 第一,严格模式下无法再意外创建全局变量。
"use strict";
// 假如有一个全局变量叫做 mistypedVariable
mistypedVaraible = 17; // 因为变量名拼写错误
// 这一行代码就会抛出 ReferenceError
- 严格模式会使引起静默失败 (silently fail,注:不报错也没有任何效果) 的赋值操作抛出异常。例如,NaN 是一个不可写的全局变量。在正常模式下,给 NaN 赋值不会产生任何作用; 开发者也不会受到任何错误反馈。但在严格模式下,给 NaN 赋值会抛出一个异常。任何在正常模式下引起静默失败的赋值操作 (给不可写属性赋值,给只读属性 (getter-only) 赋值,给不可扩展对象 (non-extensible object) 的新属性赋值) 都会抛出异常:
"use strict";// 给不可写属性赋值
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // 抛出 TypeError 错误// 给只读属性赋值
var obj2 = {get x() {return 17;},
};
obj2.x = 5; // 抛出 TypeError 错误// 给不可扩展对象的新属性赋值
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // 抛出 TypeError 错误
- 在严格模式下,试图删除不可删除的属性时会抛出异常 (之前这种操作不会产生任何效果)
"use strict";
delete Object.prototype; // 抛出 TypeError 错误
- 在 Gecko 版本 34 之前,严格模式要求一个对象内的所有属性名在对象内必须唯一。正常模式下重名属性是允许的,最后一个重名的属性决定其属性值。因为只有最后一个属性起作用,当代码要去改变属性值而不是修改最后一个重名属性的时候,复制这个对象就产生一连串的 bug。在严格模式下,重名属性被认为是语法错误:
"use strict";
var o = { p: 1, p: 2 }; // !!! 语法错误
- 严格模式要求函数的参数名唯一。在正常模式下,最后一个重名参数名会掩盖之前的重名参数。之前的参数仍然可以通过 arguments[i] 来访问, 还不是完全无法访问。然而,这种隐藏毫无意义而且可能是意料之外的 (比如它可能本来是打错了), 所以在严格模式下重名参数被认为是语法错误:
function sum(a, a, c) {// !!! 语法错误"use strict";return a + a + c; // 代码运行到这里会出错
}
- 严格模式禁止八进制数字语法。ECMAScript 并不包含八进制语法,但所有的浏览器都支持这种以零 (0) 开头的八进制语法:0644 === 420 还有 “\045” === “%”.在 ECMAScript 6 中支持为一个数字加"0o"的前缀来表示八进制数。
var a = 0o10; // ES6: 八进制
- ECMAScript 6 中的严格模式禁止设置primitive值的属性。不采用严格模式,设置属性将会简单忽略 (no-op),采用严格模式,将抛出TypeError错误
"use strict";false.true = ""; // TypeError
(14).sailing = "home"; // TypeError
"with".you = "far away"; // TypeError
- 简化变量使用
- 让 eval 和 arguments 变的简单
JavaScript严格模式