为什么我不能将"window.location.reload"作为参数传递给setTimeout?

gog*_*n13 41 javascript cross-browser

我希望通过以下代码行深入了解我在Safari和Chrome中看到的错误:

setTimeout(window.location.reload, 250);

Chrome报告:
Uncaught TypeError: Illegal invocation

和Safari:
TypeError: Type error

在FireFox中,代码运行正常.此外,此代码在三个浏览器中的每个浏览器中运行良好:

setTimeout((function() {
  window.location.reload();
}), 250);
Run Code Online (Sandbox Code Playgroud)

Chrome和Safari对此代码没有任何问题:

var say_hello = function () { alert("hello") };  
setTimeout(say_hello, 250);  
Run Code Online (Sandbox Code Playgroud)

有什么特别之处window.location.reload导致这个错误?

(不确定它是否有用,但这里有一个说明这个的jsfiddle)

Tom*_*icz 65

因为reload()需要window.location如此this.换句话说 - 它是一种方法window.location.当你说:

var fun = window.location. reload;

fun();
Run Code Online (Sandbox Code Playgroud)

您正在调用reload()函数而没有任何this引用(或使用隐式window引用).

这应该工作:

setTimeout(window.location.reload.bind(window.location), 250);
Run Code Online (Sandbox Code Playgroud)

window.location.reload.bind(window.location)部分意味着:获取window.location.reload函数并返回一个函数,该函数在被调用时将window.location用作this内部参考reload().

也可以看看


Jav*_*zán 8

还有另一种方法可以做到这一点,非常简单,不需要执行额外的步骤、绑定或类似的事情。当您使用箭头函数而不是 JS 中的常见函数时,this上下文会被包含在内。因此,您可以轻松地执行以下操作:

setTimeout(() => window.location.reload(), 250);
Run Code Online (Sandbox Code Playgroud)