我希望通过以下代码行深入了解我在 Safari 和 Chrome 中看到的错误:
setTimeout(window.location.reload, 250);
Chrome 报告:Uncaught TypeError: Illegal invocation
和 Safari:TypeError: Type error
在 FireFox 中,代码运行良好。此外,此代码在三个浏览器中的每一个中都运行良好:

setTimeout((function() {
  window.location.reload();
}), 250);

Chrome 和 Safari 对此代码没有问题:
var say_hello = function () { alert("hello") };
setTimeout(say_hello, 250);

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

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

最佳答案

因为 reload() 需要 window.location 作为 this 。换句话说 - 它是 window.location 的方法。当你说:

var fun = window.location.reload;

fun();
您正在调用 reload() 函数而没有任何 this 引用(或隐式 window 引用)。
这应该有效:
setTimeout(window.location.reload.bind(window.location), 250);
window.location.reload.bind(window.location) 部分表示:取 window.location.reload 函数并返回一个函数,该函数在调用时将使用 window.location 作为 this 内部 0x2341 引用 0x23131。
也可以看看
  • How can I pass an argument to a function called using setTimeout?
  • Why doesn't console.log work when passed as a parameter to forEach?
  • Preserve 'this' reference in javascript prototype event handler
  • 关于javascript - 为什么我不能将 "window.location.reload"作为参数传递给 setTimeout?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10839989/

    10-16 14:15