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

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

我注意到,这种行为影响的所有地类型。到底是什么事?

有帮助吗?

解决方案

这是要做到有奇怪的方式 this 结合工作在JavaScript。

[].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 方法、定义写工作上的任何地序的对象。它逆转的项目数字符串钥匙(达 object.length)和返回的对象。因此,它会回来的对象,是通过在任何类型 length 财产。

window 具有一定长度的财产,其相对应 window.frames.length, ,所以这个叫法 this 指着 window 将工作并返回 window.在理论上仍可能失败,因为:

  1. window 允许以一个"主体"而不是"当地对象";在这种情况下的保证什么你可以通过到其他的原型的方法不一定适用;和
  2. 如果窗口实际上有框架/内部框架,它将尽力扭转他们了,这不会起作用,因为该框架集是只读的。

然而,在当前的浏览器前一种情况下没有工作和后者的失败,无需一个错误,所以你还是得到 ===window 行为和不例外。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top