为什么我可以这样做:
$("button").on('click', function(){window.history.back();});
但是,当我尝试时;
$("button").on('click', window.history.back);
/*or*/ $("button").on('click', history.back);
我得到:
Uncatch TypeError: 非法调用
HTMLAnchorElement.dispatch (jquery-1.12.4.js:5226)at HTMLAnchorElement.elemData.handle (jquery-1.12.4.js:4878)
我的印象是,当没有保留的上下文时,它默认为窗口对象,这将允许我这样做?
首先,必须以 history
作为上下文调用history.back()
,如果它默认为 window
它将抛出您描述的错误。但这里的问题是 jQuery 使用绑定了事件侦听器的元素调用处理程序。
您的第一行代码有效,因为上下文与您作为处理程序传递的匿名函数无关。jQuery将元素设置为上下文这一事实并不重要,因为您可以在其中正确调用history.back()
。
您的工作代码调用history.back()
:
... window.history.back(); ...
这调用back()
作为history
对象的方法,这仅意味着在back
函数中,this
是对history
的引用。
非工作代码获取对back
函数的引用:
... window.history.back ...
然后将引用传递到 jQuery 的 .on()
方法中。
jQuery 稍后调用该函数以响应click
事件,并在该调用时设置this
。 jQuery 将this
设置为接收事件的 DOM 元素。
因此,当 back()
函数的实现引用this
期望它是history
对象时,它会得到错误的东西。
通常,当您希望事件侦听器调用不是您编写的函数时,最好将调用包装在您自己的函数中,就像在第一个示例中所做的那样。
window
的 history
属性仅引用 History 接口,并且只能全局调用。
失败的方法使用没有history
属性的元素上下文。