为什么我能这样做:
$("button").on('click', function(){window.history.back();});
然而,当我尝试时;
$("button").on('click', window.history.back);
/*or*/ $("button").on('click', history.back);
我明白了:
Uncaught TypeError:非法调用
在HTMLAnchorElement.dispatch(jquery-1.12.4.js:5226)
在HTMLAnchorElement.elemData.handle(jquery-1.12.4.js:4878)
我的印象是,当没有保留上下文时,它默认为窗口对象,这样我就可以这样做了吗?
答案 0 :(得分:3)
首先,必须使用history.back()
作为上下文调用history
,如果默认为window
,则会抛出您描述的错误。这里的问题是jQuery使用绑定了事件监听器的元素调用处理程序。
您的第一行代码有效,因为上下文与您作为处理程序传递的匿名函数无关。 jQuery将元素设置为上下文这一事实并不重要,因为您在其中正确调用了history.back()
。
答案 1 :(得分:2)
您的工作代码调用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
对象时,它就会出错。
通常,当您希望事件监听器调用您没有写过的函数时,您最好将调用包装在您自己的函数中,就像您在第一个示例中所做的那样。 / p>
答案 2 :(得分:0)
history
的{{1}}属性只是引用了History接口,只能全局调用。
失败的方法使用元素上下文,它没有window
属性。