Javascript 如何通过;这";窗口设置间隔

Javascript 如何通过;这";窗口设置间隔,javascript,Javascript,假设我有一个函数a: function a() { this.b = 1; this.set = setInterval(function() {console.log(this.b);}, 200); } 因此,当调用.set()时,将调用匿名函数。但这不会起作用,因为在触发函数时,它指向窗口对象。此外,使用a.b也不是一个好主意,因为a.b可能有多个实例 什么是解决此问题的好方法?只需将您的此引用保存在某个其他变量中,该变量稍后不会被窗口调用覆盖。稍后,您可以使用该变量引用

假设我有一个函数a:

function a() {
    this.b = 1;
    this.set = setInterval(function() {console.log(this.b);}, 200);
}
因此,当调用.set()时,将调用匿名函数。但这不会起作用,因为在触发函数时,它指向窗口对象。此外,使用a.b也不是一个好主意,因为a.b可能有多个实例


什么是解决此问题的好方法?

只需将您的
引用保存在某个其他变量中,该变量稍后不会被
窗口
调用覆盖。稍后,您可以使用该变量引用您开始使用的对象

function a() {
    this.b = 1;
    var that = this;
    this.set = setInterval(function() {console.log(that.b);}, 200);
}

在您的情况下,您可以简单地:

function a() {
    var _this = this;
    this.b = 1;
    this.set = setInterval(function () {
      console.log(_this.b);
    }, 200);
}

通常,我们还可以使用一个助手方法来修复
引用。

存储对
的引用:

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

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

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

    // 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);

既然我们现在有了ES6,我想我们需要另一个答案:

使用箭头功能:

function a() {
  this.b = 1;
  this.set = setInterval(() => {console.log(this.b);}, 200);
}

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

此问题太老了,但我不喜欢这里的解决方案,因为其主要思想是将实例附加到公共对象上

这是另一个可行的想法:

问题是,当从某个时间间隔以回调的形式调用时,作用域不在
this
内。但是,您可以通过定义一个函数变量来强制它

function a() {
  var localCallback: () => {
    // access `this` as you will
    console.log(this);
  };
  this.timer = setInterval( localCallback, this.saveInterval );
}

希望这是有帮助的

为什么不使用
apply
call
@Deeptechtons-我认为
apply
call
对这个问题没有任何用处,但也许你可以在回答中解释一下你的想法?@nnnnnn这个问题肯定是“如何在函数内部更改上下文”这类问题的候选。这是使用appy或call解决的。但是对于这种情况来说,可能有点过头了。@Deeptechtons嗯,这是一个很好的建议,但这个问题显然不应该是这个级别。@Deeptechtons-我想说的是,
调用和
应用在这里不起作用-你不能只在传递给
setInterval
的函数中添加它们,因为到那时,
这个
就不起作用了已经错了
.bind
可以工作,在传递给
setInterval
的函数中设置
这个
。是的,我见过这样的例子,但这正是让我感到困惑的地方。假设“a”在触发200ms事件之前结束,那么变量self似乎应该在那时销毁。若否,将于何时销毁??在间隔被清除之后?正如我在回答中提到的,内部函数甚至在包含函数完成之后也可以访问其包含函数范围内的变量。在这种情况下,
setInterval
继续保存对内部函数的引用,这样即使在
a()
完成后,它也可以继续调用它;在清除间隔之前,引用将保持活动状态,变量将保持活动状态。请注意,
a()
肯定会在触发间隔之前完成(无论间隔有多短),因为JS在单个线程上运行。谷歌“JavaScript闭包”获取更多信息。当“This”var也是一个JS类(如ReactJS)时,它也可以工作,而不仅仅是一个dom元素。不确定为什么,但在间隔函数中,self会切换回窗口对象?@Shane-不,它不会。但是请注意,
self
的值将取决于
a()
的调用方式,例如,如果您直接将其称为
a()
,那么
这个
(因此
self
)将是
窗口
,因为这就是
这个
在非严格模式下的工作方式。ES6已经将我的语法减少到几乎为零,再一次谢谢