<分区>
为什么我在 javascript 中需要 setTimeout.bind(window)?我看到了这样的代码片段,为什么我需要这个?我可以直接使用setTimeout。
setTimerFunctions: SetTimerFunctions = {
setInterval: setInterval.bind(window),
setTimeout: setTimeout.bind(window),
}
标签 javascript
<分区>
为什么我在 javascript 中需要 setTimeout.bind(window)?我看到了这样的代码片段,为什么我需要这个?我可以直接使用setTimeout。
setTimerFunctions: SetTimerFunctions = {
setInterval: setInterval.bind(window),
setTimeout: setTimeout.bind(window),
}
最佳答案
bind
的第一个参数是绑定(bind)函数中 this
的值。传递 window
(或 null
,这将是等效的)是将 this
附加到全局范围的一种方式。
setTimeout
是window
的一个方法(window.setTimeout
),那么那个函数里面的this
应该是window
,但在当前的浏览器中不需要它。
请记住 setTimeout(...)
等同于调用 window.setTimeout(...)
因为 window
是全局上下文.
这个
是谁?一个例子:
var foobar = window.setTimeout;
此代码无法按您预期的方式工作,这取决于我们不知道的上下文。
对于 window.setTimeout
,this
将是此赋值的上下文 this
。要强制引用另一个 this
,您必须使用 bind
设置引用:
var foobar = window.setTimeout.bind(window);
Except 从全局上下文中分配它时,在这种情况下,函数将 this
作为 window
。
在您的确切情况下,如果您不绑定(bind)而只是分配:
setTimerFunctions: SetTimerFunctions = {
setInterval: setInterval,
setTimeout: setTimeout,
}
然后 this
,从 setTimeout
/setInterval
的 Angular 来看,将是声明此代码的类的每个实例(如它似乎是 TypeScript 中类声明的一部分)。
查看文档和 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 - ionic : Show active/inactive button when two times clicked
javascript - 在 Backbone.JS 中创建不更新 ID
javascript - 如何从同一个表单中得到值(value)结果?