javascript - 为什么 setTimeout(location.reload) 抛出类型错误?

标签 javascript settimeout

<分区>

我试图理解这段代码的奇怪行为:

window.setTimeout(window.location.reload, 200);
  • 在 Firefox 中这会抛出一个 TypeError:

    TypeError: 'reload' called on an object that does not implement interface Location.

  • 在 Chromium 中,这会抛出另一个 TypeError:

    Uncaught TypeError: Illegal invocation


这两种选择都很好:

  • window.setTimeout('window.location.reload()', 200);
  • window.setTimeout(function(){window.location.reload()}, 200)

为什么?

最佳答案

这是因为 window.location.reload 会在上下文之外调用,所以实际函数 reload() 没有任何引用location 对象。

在 JavaScript 中,如果你调用函数 foo.bar(),上下文是 foo,所以 this 指的是 foo 在函数 bar 中。

但是,如果您分配 var a = foo.bar 然后调用 a()(仍然是相同的函数),它将没有上下文,因此this 将是未定义的。这就是将函数作为方法参数传递时发生的情况。

解决这个问题的通常方法是绑定(bind)上下文:

window.setTimeout(window.location.reload.bind(window.location), 200);

这确保函数将始终在 window.location 的上下文中被调用,无论它是如何调用的。

Mozilla docs 中有一个很好的例子.

关于javascript - 为什么 setTimeout(location.reload) 抛出类型错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39407803/

相关文章:

javascript - 创建后在带有模型的 html 页面中显示值

javascript - React 容器未正确绑定(bind)

javascript - mongo 聚合 - 累积一个字段的不同组的值

ajax - ajax settimeout刷新div

javascript - 如何使用 setTimeout 等待变量加载,同时接收 HTTP 请求!

javascript - 设置 fetch API 调用的延迟

javascript - 使用箭头键和智能延迟加载实现有机列表浏览

javascript - .length 仅在 setTimeout 之后未定义

javascript - 长时间保持的 AJAX 连接被防病毒软件阻止

Adobe Acrobat 的 JavaScript API - 如何使用 JavaScript 创建指向非 PDF 文档的相对链接?