3

我正在使用 John Resig 的 Simple JavaScript Inheritance 并且遇到了一个问题,我丢失了“this”所指的内容。使用此代码:

var Runner = Class.extend({ 
 init: function() {
  this.update();
  if(!this.interval) {
   this.interval = setInterval(this.update, this.period * 1000);
  }
 },
 stop: function() {
  clearInterval(this.interval);
 },
 update: function() {
  this.success()
 },
 success: function(){
 }
});

var SubRunner = Runner.extend({
 update: function() {
  this._super();
 },
 success: function(){
  alert('sub runner success');
 }
});

运行p = new SubRunner()按我的预期运行,并sub runner success在第一时间发出警报。第一次运行后,尝试在错误的“this”(窗口)上运行成功函数。

我知道 Prototype 为您提供了一个绑定函数,以便您可以将上下文传递给该函数,但我在这里做类似的事情没有任何运气。有没有人有一个起点来解决这个问题?

谢谢!

4

3 回答 3

3

问题是当您将 this.update 传递给 setInterval 函数时。在 Javascript 中,“this”取决于您是否使用点表示法调用函数,如果您将它们作为回调传递或将它们存储在变量中,函数将不会记住它们的来源。

您可以添加一个包装函数

var that = this;
setTimeout(function(){ that.update() }, this.perios*1000)

或者您可以使用 bind 方法(如果它在您的浏览器中可用)(或者您可以使用 Prototype 中的类似功能)。

setTimeout(this.update.bind(this), this.period*1000)
于 2012-08-07T20:37:00.727 回答
1

当您将 this.update 传递给 setInterval 时,您会丢失上下文。最简单的解决方案是

var that = this;
this.interval = setInterval(function() { that.update() }, this.period * 1000);
于 2012-08-07T20:39:56.053 回答
1
this.interval = setInterval(this.update, this.period * 1000);

setTimeout调用一个函数时,它会在全局范围内调用它(它设置thiswindow)。

您需要传递一个调用this.update.

var self = this;
this.interval = setInterval(function(){
    self.update();
}, this.period * 1000);
于 2012-08-07T20:40:05.393 回答