这个JavaScript是如何编译的?它看起来不对,即使对我来说,我曾经用perl编程。当我在谷歌Chrome控制台中输入时:
window[function () {}] = 42;
>>> 42
没有爆炸。怎么样?
我耸了耸肩。认为财产显然没有被分配,或者它是否至少应该被立即销毁。但是:
window[function () {}]
>>> 42
答案 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