用函数表达式命名对象属性似乎是不可能的.但是它可以编译

Naming an object property with a function expression seems as if it should be impossible. But it compiles

本文关键字:编译 不可能 似乎是 表达式 函数 属性 对象      更新时间:2023-09-26

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

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

没有爆炸。如何?

我耸了耸肩。认为财产显然不可能被分配,或者即使被分配,至少也应该立即被销毁。但罗:
window[function () {}]
>>> 42

这实际上是一个类型强制转换的例子,javascript希望将字符串用作属性名,因此它在函数定义上调用.toString()

当你做window[function () {}]时,javascript调用function () {}.toString()并获得字符串"function () {}",这成为属性名。

可以通过输入alert(function () {});

所以,你最终得到了一个属性window["function () {}"]

试试下面这个序列来说明:

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