使用函数表达式命名对象属性似乎应该是不可能的。但它编译

时间:2013-03-26 09:29:53

标签: javascript google-chrome

这个JavaScript是如何编译的?它看起来不对,即使对我来说,我曾经用perl编程。当我在谷歌Chrome控制台中输入时:

window[function () {}] = 42;
>>> 42

没有爆炸。怎么样?

我耸了耸肩。认为财产显然没有被分配,或者它是否至少应该被立即销毁。但是:

window[function () {}]
>>> 42

1 个答案:

答案 0 :(得分:3)

这实际上是类型强制的示例,其中javscript希望将字符串用作属性名称,因此它在函数定义上调用.toString()

执行window[function () {}]后,javascript会调用function () {}.toString()并获取字符"function () {}",该字符串将成为属性名称。

您可以通过执行alert(function () {});

来查看

因此,您最终得到了一个属性window["function () {}"]

尝试此序列来说明:

window[function () {x=1;}] = 42;
alert(window["function () {x=1;}"]);    // alerts 42