本文最后更新于:2023年3月19日 晚上
本文转自:https://juejin.im/post/6844903566121893895
JavaScript 中的 严格模式
严格模式
:使用严格模式的好处是可以提早知道代码中存在的错误,及时捕获一些可能导致编程错误的 ECMAScript 行为。
严格模式的选择使用
严格模式的编译指示(pragma): "use strict";
,支持严格模式的引擎会启动这种模式,而不支持该模式的引擎就当遇到了一个未赋值的字符串字面量,会忽略这个编译指示。
- 在全局作用域中(函数外部)给出这个编译指示,则整个脚本都将使用严格模式。
- 在函数作用域中给出这个编译指示,则这个函数将使用严格模式
1 2 3 4
| function test () { "use strict"; ... }
|
严格模式的规范
变量
- 不允许意外创建全局变量,给一个没有声明的变量赋值,那代码在执行时就会抛出 ReferenceError
1 2 3 4
|
message = "Hello world! ";
|
- 不能对变量调用 delete 操作符
1 2 3 4 5
|
var color = "red"; delete color;
|
- 严格模式下对变量名也有限制,不能使用 implements、interface、let、package、 private、protected、public、static 和 yield 标识符作为变量名,使用以上标识符作为变量名会导致语法错误。
对象
- 为只读属性赋值会抛出 TypeError
- 对不可配置的(nonconfigurable)的属性使用 delete 操作符会抛出 TypeError
- 为不可扩展的(nonextensible)的对象添加属性会抛出 TypeError
- 使用对象字面量时,属性名必须唯一
1 2 3 4 5 6 7
|
var person = { name: "Nicholas", name: "Greg", };
|
函数
- 严格模式要求命名函数的参数必须唯一
1 2 3 4 5 6
|
function sum(num, num) { }
|
- 在非严格模式下,修改命名参数的值也会反映到 arguments 对象中,而严格模式下这两个值是完全独立的
1 2 3 4 5 6 7 8 9
|
function showValue(value) { value = "Foo"; console.log(value); console.log(arguments[0]); } showValue("Hi");
|
- arguments.callee 和 arguments.caller,在非严格模式下,这两个属性一个引用函数本身,一个引用调用函数。而在严格模式下,访问哪个属性都会抛出 TypeError
1 2 3 4 5 6 7 8 9 10 11
|
function factorial(num) { if (num <= 1) { return 1; } else { return num * arguments.callee(num - 1); } } var result = factorial(5);
|
- 严格模式对函数名也做出了限制,不允许用 implements、interface、let、package、private、protected、public、static 和 yield 作为函数名
- 只能在脚本的顶级和在函数内部声明函数
1 2 3 4 5 6 7 8
|
if (true) { function doSomething() { } }
|
eval()
- 在严格模式中,它在包含上下文中不再创建变量或函数
1 2 3 4 5 6 7
|
function doSomething() { eval("var x=10"); alert(x); }
|
- 可以在 eval()中声明变量和函数,但这些变量或函数只能在被求值的特殊作用域中有效,随后就将被销毁
1 2 3
| "use strict"; var result = eval("var x=10, y=11; x+y"); alert(result);
|
eval 和 arguments
严格模式已经明确禁止使用 eval 和 arguments 作为标识符,也不允许读写它们的值。
1 2 3 4 5
|
var eval = 10; var arguments = "Hello world!";
|
抑制 this
在非严格模式下使用函数的 apply()或 call()方法时,null 或 undefined 值会被转换为全局 对象。而在严格模式下,函数的 this 值始终是指定的值,无论指定的是什么值。
1 2 3 4 5 6 7 8
|
var color = "red"; function displayColor() { alert(this.color); } displayColor.call(null);
|
其他变化
- 非严格模式下的 with 语句能够改变解析标识符的路径。严格模式下,with 被简化掉了
1 2 3 4 5 6
|
with (location) { alert(href); }
|
- 严格模式去掉了 JavaScript 中的八进制字面量
- 严格模式下 parseInt()的行为,八进制字面量在严格模式下会被当作以 0 开头的十进制字面量
1 2 3 4
|
var value = parseInt("010");
|