我试图理解这段代码的奇怪行为:
window.setTimeout(window.location.reload, 200);
在Firefox中会引发TypeError:
TypeError:'重新加载'调用了一个没有实现接口Location的对象。
在Chromium中会抛出另一个TypeError:
未捕获的TypeError:非法调用
这两种选择工作正常:
window.setTimeout('window.location.reload()', 200);
window.setTimeout(function(){window.location.reload()}, 200)
为什么?
答案 0 :(得分:6)
这是因为window.location.reload
将被取消上下文,因此实际函数reload()
没有对location
对象的任何引用。
在JavaScript中,如果您调用函数foo.bar()
,则上下文为foo
,因此this
引用函数foo
中的bar
。
但是,如果您指定var a = foo.bar
然后调用a()
(仍然是相同的功能),则它将没有上下文,因此this
将是未定义的。将函数作为方法参数传递时会发生这种情况。
解决此问题的常用方法是绑定上下文:
window.setTimeout(window.location.reload.bind(window.location), 200);
这确保了在window.location
的上下文中始终会调用该函数,无论它是如何被调用的。
Mozilla docs中有一个很好的例子。