【问题标题】:What is a direct reference?什么是直接参考?
【发布时间】: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


【解决方案1】:

是的,References (EcmaScript §8.7) 有不同的类型。例如,成员运算符 (EcmaScript §11.2.1) 确实会导致 base valuebaseReference 的值的引用,我称之为“非直接”。 “直接引用”是标识符引用(EcmaScript §10.2.2.1,其中基值是环境记录。

【讨论】:

  • 我的意思是,关于“直接引用”的其他类型。 (那么,给定一个直接引用,还有其他类型的引用不是直接引用吗?)那一章没有提到这个术语。
  • 是的,可以。直接引用是通过identifier resolution单独解析的引用,而间接引用是属性引用(例如obj.prop),它通过两个步骤解析:首先对名称"obj"进行标识符解析,解析为对对象的引用,然后伪造一个new引用,其基值是对象引用,然后名字是"prop"。是的,我想就是这样。
【解决方案2】:

如果我理解正确,任何未定义为属性的东西。

这些应该在控制台中抛出错误或失败:

(function(){ 'use strict'; var x = '2'; delete x; })();
(function(){ 'use strict'; delete arguments[0]; })('2');

【讨论】:

  • 即使你定义了一个全局变量,如果你只用名字来引用它,它仍然会抛出。例如:this.x = true;(在全局代码中,所以this 是全局对象),现在delete x 会抛出,但delete this.x 不会。所以,重要的是你如何在 delete-expression 中引用它,而不是它是否是全局属性。
  • 是的,我以为我在控制台中测试时没有严格模式。固定。
猜你喜欢
  • 1970-01-01
  • 2018-07-17
  • 2012-11-28
  • 2011-11-30
  • 2018-05-30
  • 1970-01-01
  • 2010-09-11
  • 2020-09-24
  • 1970-01-01
相关资源
最近更新 更多