这个 JavaScript 是如何编译的?即使对我来说,它看起来也是错误的,而且我曾经用 perl 编程过。当我在 Google Chrome 控制台中输入此内容时:
window[function () {}] = 42;
>>> 42
什么都没有爆炸。如何?
我耸了耸肩。认为财产显然不能被分配,或者如果是的话,它至少应该被立即销毁。但是看:
window[function () {}]
>>> 42
这个 JavaScript 是如何编译的?即使对我来说,它看起来也是错误的,而且我曾经用 perl 编程过。当我在 Google Chrome 控制台中输入此内容时:
window[function () {}] = 42;
>>> 42
什么都没有爆炸。如何?
我耸了耸肩。认为财产显然不能被分配,或者如果是的话,它至少应该被立即销毁。但是看:
window[function () {}]
>>> 42
这实际上是一个类型强制的示例,其中 javscript 希望将字符串用作属性名称,因此它调用.toString()
函数定义。
当您这样做时window[function () {}]
,javascript 调用function () {}.toString()
并获取"function () {}"
成为属性名称的字符串。
你可以通过这样做看到alert(function () {});
因此,您最终得到了一个 property window["function () {}"]
。
试试这个序列来说明:
window[function () {x=1;}] = 42;
alert(window["function () {x=1;}"]); // alerts 42