原始来源:http://twitter.com/tobeytailor/status/8998006366
(x=[].reverse)() === window // true
我注意到这种行为会影响所有 native 类型。这里究竟发生了什么?
最佳答案
这与 this
绑定(bind)在 JavaScript 中工作的奇怪方式有关。
[].reverse
是空列表上的方法reverse
。如果您通过以下方式之一调用它:
[].reverse();
[]['reverse']();
([].reverse)();
然后它使用绑定(bind)到列表实例[]
的this
来执行。但如果你将其分离:
x= [].reverse;
x();
它在没有 this
绑定(bind)的情况下执行,因此函数中的 this
指向全局(window
)对象,在 JavaScript 的其中一个最糟糕、最具误导性的设计错误。
(x=[].reverse)()
也在进行分离。赋值运算符返回与传递的函数对象相同的函数对象,因此看起来它什么也没做,但它具有破坏导致 JavaScript 绑定(bind) this
的有限特殊情况的副作用。
所以你是说:
Array.prototype.reverse.call(window)
reverse
与许多其他 Array.prototype
方法一样,由 ECMAScript 定义,可用于任何 native 类似序列的对象。它使用数字字符串键反转项目(最多 object.length
)并返回对象。因此它将返回为具有 length
属性的任何类型传入的对象。
window
有一个 length 属性,对应于 window.frames.length
,因此使用指向 的
将工作并返回 this
来调用此方法windowwindow
。理论上它仍然可能会失败,因为:
window
允许作为“宿主对象”而不是“ native 对象”;在这种情况下,关于可以传递给其他原型(prototype)方法的内容的保证不一定适用;和- 如果窗口实际上有框架/iframe,它会尝试颠倒它们的顺序,但这是行不通的,因为框架集合是只读的。
但是,在当前的浏览器中,前一种情况确实有效,而后者则默默地失败而没有错误,因此您仍然会得到 ===window
行为,而不是异常。
关于javascript - 有人可以解释一下这个 Javascript 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2261342/