gpt4 book ai didi

javascript - 删除不合格标识符时严格模式语法错误背后的动机?

转载 作者:可可西里 更新时间:2023-11-01 01:34:05 25 4
gpt4 key购买 nike

我无法理解为什么在严格模式下,当 delete 用于非限定标识符时会发生语法错误。

在大多数情况下,这是有道理的...如果您以通常的方式使用 var 关键字声明变量,然后尝试对它们使用 delete,在非严格模式下,它会悄无声息地失败,因此在这些情况下,严格模式因错误而失败是有意义的。

但是,有些情况下您不能删除合格的标识符:

(function() {

// "use strict";

var obj = Object.create({}, { bloop: { configurable: false } });

delete obj.bloop; // throws TypeError in strict mode, silently fails in non-strict.

console.log('bloop' in obj); // true

}());

严格模式必须在这里做一个运行时检查,因为遇到这个会抛出TypeError。还有一些情况你可以在非严格模式下成功删除不合格的标识符...

// "use strict";

window.bar = 6;

console.log(typeof bar); // number

delete bar; // works in non-strict, syntax error in strict!

console.log(typeof bar); // undefined

事实上,据我了解,是否可以删除东西(在非严格模式下)取决于内部的 [[Configurable]] 属性,与限定标识符无关.据我所知,在严格模式下无法删除(作为本地 VO 的属性) 可配置的非全局变量:

(function() {

// "use strict";

eval('var foo = 5;');

console.log(typeof foo); // number

delete foo; // works in non-strict, SyntaxError in strict.

console.log(typeof foo); // undefined

}());

所以,我的问题是,当在非限定标识符上使用 delete 时抛出 SyntaxError 有什么意义,如果属性不可配置,无论如何都会抛出 TypeError?这似乎是一个不必要的限制,在某些情况下,除了不使用严格模式(第三个示例)之外似乎没有任何解决方法。谁能解释一下这个决定背后的动机?


更新:我刚刚意识到我忽略了一个事实,即直接 eval 调用在严格模式下有自己的范围,而不是调用函数的范围,所以在第三个例子中 foo 不会在严格模式下定义。无论如何,运行时检查仍然会捕捉到这一点,但它提出了一个附带问题:是否没有办法在严格模式下拥有可配置的局部变量,就像我们在非严格模式下使用 eval 变量声明一样?据我所知,这是 eval 的少数合法用途之一。

最佳答案

你说的是Section 11.4.1, paragraph 5.a.规范:

  1. Else, ref is a Reference to an Environment Record binding, so
    a. If IsStrictReference(ref) is true, throw a SyntaxError exception.
    b. Let bindings be GetBase(ref).
    c. Return the result of calling the DeleteBinding concrete method of bindings, providing GetReferencedName(ref) as the argument.

你所谓的“不合格标识符”正式命名为“环境记录绑定(bind)”。

现在,回答你的问题。为什么在 5.c 时抛出 SyntaxError。无论如何都会失败?我想你自己回答了!

Strict mode must do a runtime check here, because a TypeError is thrown when this is encountered.

没错。但快速失败总是更好。因此,当有机会检测到 SyntaxError(在解析时)时,应该捕获这个机会。

为什么?如果发生错误,它可以避免您修复应用程序的麻烦。考虑一下可能会立即向您显示错误的 IDE,而不是数小时的调试。
此外,此类限制可能有利于优化的 JIT 编译器。

关于javascript - 删除不合格标识符时严格模式语法错误背后的动机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10643587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com