Javascript addEventListener中的location.reload
我试图在单击按钮时重新加载文档。这是我的密码:Javascript addEventListener中的location.reload,javascript,typeerror,location-href,Javascript,Typeerror,Location Href,我试图在单击按钮时重新加载文档。这是我的密码: var e = document.getElementById('a'); e.addEventListener('click',location.reload); 它返回uncaughttypeerror:单击e后非法调用。但是,以下代码起作用,文档被重新加载: var e = document.getElementById('a');//same thing e.addEventListener('click',function(){loca
var e = document.getElementById('a');
e.addEventListener('click',location.reload);
它返回uncaughttypeerror:单击e
后非法调用。但是,以下代码起作用,文档被重新加载:
var e = document.getElementById('a');//same thing
e.addEventListener('click',function(){location.reload()});
//warp location.reload inside function -> works!
我不明白为什么第一个代码不起作用。有人能解释一下吗?谢谢 第一个示例中的回调函数调用缺少()。应该是:
var e=document.getElementById('a');e、 addEventListener('click',location.reload())
调用location.reload()
时,它不仅调用函数,还将this
设置为location
的值,因此这两个值是等效的:
location.reload();
location.reload.call(location);
但是,当您将其提供给addEventListener
时,只存储函数引用,而不存储this
的值,因此当调用它时,它相当于
location.reload.call(undefined); // strict mode
location.reload.call(window); // sloppy mode
例如,Firefox提供了一条更清晰的错误消息:TypeError:对未实现接口位置的对象调用了“reload”。
因此,为了实现正确的行为,您需要创建一个闭包,或者将此
绑定到位置
,这样两者都可以工作:
e.addEventListener('click', function(){location.reload()});
e.addEventListener('click', location.reload.bind(location));
在第一种情况下,eventListener的第二个参数不是function@bugs是的window.location.reload
是一个函数。可能与No.重复,这将导致location.reload
的返回值作为回调函数传递,而不是函数引用本身。它将导致页面无限刷新,因为每次加载页面时都会调用函数(以获取其返回值),而不是每次单击按钮时。。。