如何将"this"传递给window setInterval

NSF*_*NSF 8 javascript

假设我有一个功能:

function a() {
    this.b = 1;
    this.set = setInterval(function() {console.log(this.b);}, 200);
}
Run Code Online (Sandbox Code Playgroud)

因此,当调用a.set()时,将调用匿名函数.但是当这个函数被触发指向窗口对象时,这不会起作用.使用ab也不是一个好主意,因为可能有多个实例.

什么是这个问题的好方法?

nnn*_*nnn 18

存储引用this:

function a() {
    var self = this;
    self.b = 1;
    self.set = setInterval(function() {console.log(self.b);}, 200);
}
Run Code Online (Sandbox Code Playgroud)

您传递给的匿名函数可以setInterval访问其包含范围中的任何变量,即任何局部变量function a().JS闭包的神奇之处在于,即使在a()完成之后,这些变量也会保持活跃状态,并且每次调用a()都会获得自己的闭包.


Dbl*_*Dbl 6

这将是最干净的解决方案,因为大多数情况下您实际上想要为连续的方法调用切换此上下文:

    // store scope reference for our delegating method
    var that = this;
    setInterval(function() {
        // this would be changed here because of method scope, 
        // but we still have a reference to that
        OURMETHODNAME.call(that);
    }, 200);
Run Code Online (Sandbox Code Playgroud)


Lux*_*Lux 5

既然我们现在有了ES6,我认为我们需要在这里另外一个答案:

使用箭头功能:

function a() {
  this.b = 1;
  this.set = setInterval(() => {console.log(this.b);}, 200);
}
Run Code Online (Sandbox Code Playgroud)

与普通功能相反,箭头功能this本身没有上下文。这意味着您可以访问外部this