ECMAScript函数返回引用的真实世界示例是什么?

21

ECMAScript规范第8.7节 引用规范类型 规定:

Reference类型用于解释deletetypeof以及赋值运算符等操作的行为。[...] 引用是一个已解析的名称绑定。

函数调用允许返回引用。这种可能性仅出于宿主对象的考虑。本规范定义的任何内置ECMAScript函数都不返回引用,也没有用户定义的函数返回引用的规定。

我被最后两句话深深打动了。有了这个,你就可以做像coolHostFn() = value这样的事情(顺便说一下,这是有效的语法)。所以我的问题是:

是否有任何ECMAScript实现定义的宿主函数对象会导致Reference值?


3
相关吗?https://dev59.com/E3A65IYBdhLWcg3wogSe - bfavaretto
是的,我认为是这样。那个问题证明了我上面使用的语法是有效的 :-) - Bergi
我刚才在谷歌上搜索了"returns a reference" javascript 并查看了前几页的结果,但是并没有找到相关内容。 - Nathan MacInnes
1个回答

7

谷歌浏览器的引擎工作方式与此非常相似。但是,当执行以下操作时,您将在控制台中收到一个ReferenceError: Invalid left-hand side in assignment

var myObj = new Object();
function myFunc() {
    myObj.test = "blah";
    return myObj;
}
myFunc() = new String("foobar");

这是一个早期的错误,但因为v8的ECMAScript实现,在假定引用错误之前正确执行myFunc应该可以正常工作。所以,在v8的当前实现中?是和否。它默认情况下已经实现了(由于语言结构),但该功能被另一个问题阻止。coolHostFn() = value不应返回错误,确实应该能够正常执行。然而,3=4肯定会返回左手赋值错误。这并不完全回答你的问题,但我希望它能帮助澄清为什么它不起作用。(如果有人想参与讨论,这是问题/票据的链接:http://code.google.com/p/v8/issues/detail?id=838)

1
谢谢,有趣的是Chrome根本不支持这些功能。然而,它确实没有回答问题“有这样的功能吗?”(因为你不能编写一个myFunc,它必须是一个宿主对象) - Bergi
确实。我没有足够的声望来发表评论,所以我想我会尝试回答一下。对于“是否存在这样的函数?”的答案是肯定的。Chrome不支持实际上是一个缺陷,而不是有意忽略或故意不支持特定实现。是的,这个例子有点粗糙。只是为了尽可能好地解释而组合在一起的。 :) - Swivel
似乎ES6使这成为一个早期错误,因此v8现在遵循规范...(请参见链接的错误) - Jonas Wilms
@Bergi 如果这个答案符合你的问题,你介意接受它吗? - Swivel
@Swivel 不,我不认为这回答了我的“生成引用值的主机函数”问题。 - Bergi
@Bergi 抱歉。重新阅读了问题。你是完全正确的。 - Swivel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接