有人可以解释这个Javascript方法吗?

时间:2010-02-14 14:13:03

标签: javascript string window reverse

原始来源:http://twitter.com/tobeytailor/status/8998006366

(x=[].reverse)() === window // true

我注意到这种行为会影响所有本机类型。到底发生了什么?

1 个答案:

答案 0 :(得分:40)

这与JavaScript中奇怪的this绑定方式有关。

[].reverse

是空列表中的方法reverse。如果您通过以下方式之一致电:

[].reverse();
[]['reverse']();
([].reverse)();

然后执行this绑定到列表实例[]。但如果你分开它:

x= [].reverse;
x();

它执行时没有this - 绑定,因此函数中的this指向全局(window)对象,这是JavaScript中最糟糕,最误导性的设计错误之一。

(x=[].reverse)()

也在做分离。赋值运算符返回它传递的相同函数对象,因此看起来它什么都不做,但它具有打破导致JavaScript绑定this的有限特殊情况的副作用。

所以你说:

Array.prototype.reverse.call(window)
与许多其他reverse方法一样,

Array.prototype由ECMAScript定义,可以处理任何类似本机序列的对象。它使用数字字符串键(最多object.length)反转项目并返回对象。因此,它将返回为具有length属性的任何类型传入的对象。

window有一个长度属性,对应window.frames.length,因此调用此方法时this指向window将会有效并返回window。理论上它可能仍然失败,因为:

  1. window被允许是“宿主对象”而不是“本地对象”;在这种情况下,关于你可以传递给其他原型方法的保证并不一定适用;和
  2. 如果窗口实际上有框架/ iframe,它会尝试颠倒它们的顺序,这不起作用,因为框架集合是只读的。
  3. 但是,在当前的浏览器中,前一种情况确实有效,而后一种情况无声地失败而没有错误,所以你仍然得到===window行为而不是异常。