繁体   English   中英

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

[英]Can somebody explain this Javascript method?

原始来源: 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)

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

window有一个length属性,对应于window.frames.length ,因此使用this指向window调用此方法将起作用并返回window 理论上它可能仍然失败,因为:

  1. window被允许是“主机对象”而不是“本机对象”; 在这种情况下,关于你可以传递给其他原型方法的保证并不一定适用;
  2. 如果窗口实际上有帧/ iframe,它会尝试反转它们的顺序,这不起作用,因为帧集合是只读的。

但是,在当前的浏览器中,前一种情况确实有效,后者无故障地失败而没有错误,所以你仍然得到===window行为而不是异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM