javascript - 为什么我需要 setTimeout.bind(window)

标签 javascript

<分区>

为什么我在 javascript 中需要 setTimeout.bind(window)?我看到了这样的代码片段,为什么我需要这个?我可以直接使用setTimeout。

setTimerFunctions: SetTimerFunctions = {
    setInterval: setInterval.bind(window),
    setTimeout: setTimeout.bind(window),
  }

最佳答案

.绑定(bind)

bind 的第一个参数是绑定(bind)函数中 this 的值。传递 window(或 null,这将是等效的)是将 this 附加到全局范围的一种方式。

设置超时

setTimeoutwindow的一个方法(window.setTimeout),那么那个函数里面的this应该是window,但在当前的浏览器中不需要它。

请记住 setTimeout(...) 等同于调用 window.setTimeout(...) 因为 window 是全局上下文.

这个是谁?

一个例子:

var foobar = window.setTimeout;

此代码无法按您预期的方式工作,这取决于我们不知道的上下文。

对于 window.setTimeoutthis 将是此赋值的上下文 this。要强制引用另一个 this,您必须使用 bind 设置引用:

var foobar = window.setTimeout.bind(window);

Except 从全局上下文中分配它时,在这种情况下,函数将 this 作为 window

你的代码没有绑定(bind)

在您的确切情况下,如果您不绑定(bind)而只是分配:

setTimerFunctions: SetTimerFunctions = {
    setInterval: setInterval,
    setTimeout: setTimeout,
  }

然后 this,从 setTimeout/setInterval 的 Angular 来看,将是声明此代码的类的每个实例(如它似乎是 TypeScript 中类声明的一部分)。

额外:函数 vs 箭头函数

查看文档和 function 之间的差异和 arrow functions => ,这个问题是添加箭头函数的原因之一。

关于javascript - 为什么我需要 setTimeout.bind(window),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57527763/

相关文章:

javascript - 用于复杂 Web 项目的单元测试框架/工具

javascript - 异步获取数据,将结果聚合到一个对象。默认情况下,对象是否被 javascript 锁定?

javascript - 使用 jquery ajax 调用的 Asp.Net MVC Razor 图

javascript - 减少与过滤和映射

javascript - ionic : Show active/inactive button when two times clicked

javascript - 在 Backbone.JS 中创建不更新 ID

javascript - jqGrid 创建单独的函数

javascript - 如何从同一个表单中得到值(value)结果?

javascript - 单击 Javascript 时在按钮中附加 div

javascript - 合并 JavaScript 文件