有人能解释这Javascript方法?
-
20-09-2019 - |
题
原来源: 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
.在理论上仍可能失败,因为:
window
允许以一个"主体"而不是"当地对象";在这种情况下的保证什么你可以通过到其他的原型的方法不一定适用;和- 如果窗口实际上有框架/内部框架,它将尽力扭转他们了,这不会起作用,因为该框架集是只读的。
然而,在当前的浏览器前一种情况下没有工作和后者的失败,无需一个错误,所以你还是得到 ===window
行为和不例外。
不隶属于 StackOverflow