ES5严格模式的作用

时间:2020-05-01

严格模式是采用具有限制性JavaScript变体的一种方式,从而使代码显示地 脱离“马虎模式/稀松模式/懒散模式“(sloppy)模式。

严格模式对正常的 JavaScript语义做了一些更改。

  1. 严格模式通过抛出错误来消除了一些原有静默错误
  2. 严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快
  3. 严格模式禁用了在ECMAScript的未来版本中可能会定义的一些语法。

严格模式可以应用到整个脚本或个别函数中。不要在封闭大括弧 {} 内这样做,在这样的上下文中这么做是没有效果的。在 eval 、Function 、内联事件处理属性、  WindowTimers.setTimeout() 方法中传入的脚本字符串,其行为类似于开启了严格模式的一个单独脚本,它们会如预期一样工作。

为整个脚本文件开启严格模式,需要在所有语句之前放一个特定语句 "use strict"; (或 'use strict';

同样的,要给某个函数开启严格模式,得把 "use strict";  (或 'use strict'; )声明一字不漏地放在函数体所有语句之前。

严格模式下无法再意外创建全局变量。

严格模式会使引起静默失败(silently fail,注:不报错也没有任何效果)的赋值操作抛出异常

"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错误

在严格模式下, 试图删除不可删除的属性时会抛出异常

<script>
    "use strict";
    delete Object.prototype;
</script>

严格模式要求一个对象内的所有属性名在对象内必须唯一

严格模式要求函数的参数名唯一

严格模式禁止八进制数字语法

可以这样写

<script>
    "use strict";

    var a = 0o65;
    console.log(a);
</script>

ECMAScript 6中的严格模式禁止设置primitive值的属性