有人能解释一下这个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
。理论上,它仍然可能失败,因为:
窗口
允许是“主机对象”而不是“本机对象”;在这种情况下,关于您可以传递给其他原型的方法的保证不一定适用;及但是,在当前的浏览器中,前一种情况确实有效,而后一种情况会在没有错误的情况下悄无声息地失败,因此您仍然会得到
==window
行为,而不是异常。[].reverse.call(y)==y
用于所有标量y
。我注意到这种行为。。。什么行为?在这个问题上我需要帮助。请问:你知道为什么有人会编代码吗?我的意思是,我当然理解为什么会产生这种效果,但为什么我要把它放在我的代码中呢?它实现了什么?完全没有。它只是在炫耀JavaScript的许多意想不到的行为之一。如果我在真正的代码中找到这个,我会担心的!执行此操作的一个可能原因是检查是否有其他脚本与窗口对象(window=open(window=open”)发生冲突http://google.com/)
就足够了<代码>变量窗口=(x=[].reverse)()代码>可以在本地还原它。
Array.prototype.reverse.call(window)