javascript - 有人可以解释一下这个 Javascript 方法吗?

标签 javascript string window reverse

原始来源: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 来调用此方法window 将工作并返回 window。理论上它仍然可能会失败,因为:

  1. window 允许作为“宿主对象”而不是“ native 对象”;在这种情况下,关于可以传递给其他原型(prototype)方法的内容的保证不一定适用;和
  2. 如果窗口实际上有框架/iframe,它会尝试颠倒它们的顺序,但这是行不通的,因为框架集合是只读的。

但是,在当前的浏览器中,前一种情况确实有效,而后者则默默地失败而没有错误,因此您仍然会得到 ===window 行为,而不是异常。

关于javascript - 有人可以解释一下这个 Javascript 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2261342/

相关文章:

java - String replaceAll(,) 方法 Java 的不区分大小写的变量

python - 生成 52 个随机字母的间隔流,其中每个字母出现两次

ubuntu - 在窗口 ubuntu (ZSH) 中找不到“打开”命令

python - Pygame,当我尝试单击窗口时,窗口变得无响应

window - 关闭 SDL 窗口而不退出 SDL

c - 输出不正确,简单的字符串练习 - C

javascript - Document.domain 和 <iframe>s 破坏了 Internet Explorer 中的 "Back"按钮

javascript - npm 更像 mvn 还是 pip?

javascript - 脚本的奇怪行为

javascript - 如何在react-native中根据条件导出对象?