Javascript 为什么需要setTimeout.bind(窗口)

Javascript 为什么需要setTimeout.bind(窗口),javascript,Javascript,为什么我需要javascript中的setTimeout.bind(窗口)?我看到这样的代码片段,为什么我需要这个?我可以直接使用setTimeout setTimerFunctions: SetTimerFunctions = { setInterval: setInterval.bind(window), setTimeout: setTimeout.bind(window), } 绑定 bind的第一个参数是绑定函数中的this的值。传递窗口(或null,这是一种将此

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

setTimerFunctions: SetTimerFunctions = {
    setInterval: setInterval.bind(window),
    setTimeout: setTimeout.bind(window),
  }
绑定
bind
的第一个参数是绑定函数中的
this
的值。传递
窗口
(或
null
,这是一种将
附加到全局范围的方法

设置超时
setTimeout
window
window.setTimeout
)的一种方法,那么
该函数中的
应该是
window
,但在当前浏览器中不需要它

请记住,
setTimeout(…)
相当于调用
window.setTimeout(…)
,因为
window
是全局上下文

谁是这个
? 例如:

var foobar = window.setTimeout;
这段代码无法按您预期的方式工作,这取决于我们不知道的上下文

对于
window.setTimeout
将是此分配的上下文
。要强制引用另一个
,必须使用
绑定设置引用:

var foobar = window.setTimeout.bind(window);
除非从全局上下文分配它,否则在这种情况下,函数将具有
作为
窗口

您的代码没有绑定 在您的情况下,如果您不绑定,只分配:

setTimerFunctions: SetTimerFunctions = {
    setInterval: setInterval,
    setTimeout: setTimeout,
  }
然后,从
setTimeout
/
setInterval
的角度来看,
this
将是声明此代码的类的每个实例(因为它似乎是TypeScript中类声明的一部分)

额外:功能vs箭头功能
查看文档以及与之间的差异,此问题是添加箭头函数的原因之一。

当对
obj
调用
method
时,
method
的上下文(
this
)绑定到
obj
。这称为动态调用,因为上下文根据调用方法的对象而变化(是动态的)-

const obj={
方法:函数(){
console.log('self',this==obj)
console.log('window?',this==window)
}
}

obj.method()//大家好,欢迎来到StackOverflow!撇开细节不谈,我有一些坏消息;我们在这里不是为了回答有关技术细节的问题;我们在这里的目的是帮助您修复损坏的代码,并回答您的代码为什么不工作,我们不能提供“为什么这样做”或“为什么我需要这样做”,这就是谷歌的目的:)向后兼容性,因为有些浏览器没有为您绑定它,就像你过去必须通过
console.log.bind(console)
而不是
console.log
才能为你“粘贴”上下文一样。@SamSwift可能重复웃 不,这些问题完全是关于主题的。这不是“为我调试我的代码”服务。@dandavis如果您有答案,请将其发布为正确答案,那么我不必使用这种方式,我只能使用
setTimeout()
。我的意思是它已经绑定了,我错了吗?只是做
var foobar=window.setTimout
将无法按预期方式工作,因为您引用的函数没有绑定的
this
,那么
this
将是该赋值的上下文,不一定是全局/窗口范围,除非它在那里赋值或静态绑定。如果我想将setTimeout()赋值到对象的属性中,您是对的,我应该使用.bind(窗口)。否则,我无法在其他地方调用对象的属性。我在寻找是否有其他理由像这样使用setTimeout。因为在对象中分配setTimeout()并在需要时调用该对象对我来说没有意义,相反,我可以在需要时直接调用setTimeout。(顺便说一句,这不是我的代码,我正在努力理解以进行维护)你是对的,你的代码,没有更多的上下文,似乎无法解决任何问题,只是将那些全局方法引用到内部方法。它只是一个。“胖箭头”来自CoffeeScript等语言,其中箭头函数
x->…
与胖箭头
x=>…
不同。JavaScript没有这样的区别。