有人能解释一下这个Javascript方法吗?

有人能解释一下这个Javascript方法吗?,javascript,string,window,reverse,Javascript,String,Window,Reverse,原始资料来源: 我注意到这种行为会影响所有本地类型。这里到底发生了什么?这与JavaScript中的这种绑定的奇怪方式有关 [].reverse 是空列表上的方法反向。如果您通过以下方式之一调用它: [].reverse(); []['reverse'](); ([].reverse)(); 然后,它将执行绑定到列表实例的this[]。但如果你拆下它: x= [].reverse; x(); 它在执行时没有绑定this,因此函数中的this指向全局(窗口)对象,这是JavaScript最糟

原始资料来源:


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

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

[].reverse
是空列表上的方法<代码>反向。如果您通过以下方式之一调用它:

[].reverse();
[]['reverse']();
([].reverse)();
然后,它将执行绑定到列表实例的
this
[]。但如果你拆下它:

x= [].reverse;
x();
它在执行时没有绑定this,因此函数中的this指向全局(
窗口
)对象,这是JavaScript最糟糕、最容易误导的设计错误之一

(x=[].reverse)()
也正在进行分离。赋值运算符返回它传递的同一个函数对象,因此看起来它什么也没做,但它的副作用是打破了导致JavaScript绑定此的有限特例

你是说:

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

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

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

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

    [].reverse.call(y)==y
    用于所有标量
    y
    。我注意到这种行为。。。什么行为?在这个问题上我需要帮助。请问:你知道为什么有人会编代码吗?我的意思是,我当然理解为什么会产生这种效果,但为什么我要把它放在我的代码中呢?它实现了什么?完全没有。它只是在炫耀JavaScript的许多意想不到的行为之一。如果我在真正的代码中找到这个,我会担心的!执行此操作的一个可能原因是检查是否有其他脚本与窗口对象(
    window=open(
    window=open”)发生冲突http://google.com/)
    就足够了<代码>变量窗口=(x=[].reverse)()可以在本地还原它。
    Array.prototype.reverse.call(window)