【发布时间】:2012-09-26 20:56:42
【问题描述】:
严格模式规则之一 (Annex C) 规定:
当
delete运算符出现在严格模式代码中时,如果其 UnaryExpression 是对变量、函数参数或函数名称的直接引用,则会引发 SyntaxError .
所以在这段代码中:
delete x
x 是一个参考。 (我知道这是因为"the result of evaluating an Identifier is always a value of type Reference")。但它是直接引用吗?
还有,还有其他类型的参考吗?间接引用? (如果不是,那么使用“直接”这个词有什么意义?)
【问题讨论】:
-
“直接引用”仅表示没有点或下标符号的引用。 V8 将其称为“非限定标识符”。
-
@GGG 是的,这听起来很合理。此外,当
delete x时,Firefox 会抛出 "SyntaxError: Apply the 'delete' operator to an unqualified name is deprecated",这证实了您的说法。 -
我现在想知道的是修复了什么问题。我什至不知道您可以在严格模式之前删除非属性。我想如果你杀死所有引用指向的东西,可能会在涉及长链引用时引起一些混乱。
-
@ErikReppen
delete旨在删除属性。试图删除变量和其他类型的直接引用是不恰当的使用。默认情况下,JavaScript 会忽略这种不当使用,而仅返回false。但是,严格模式会抛出。当程序不正确地使用运算符(如delete)时,程序应该抛出 - 所以,严格模式做正确的事。理想情况下,这应该是默认行为,但这会破坏一些现有(遗留)程序。这就是为什么这种行为是通过严格模式选择加入的。 -
啊,好吧。在 Chrome 中,您至少可以删除非严格的全局变量。
标签: javascript reference theory