0

我尝试在 setinterval 函数实现后访问“this”,但无法从该函数访问它。图示如下:

apple:'apple',
orange:'orange',
pie:'pie',
initialize:function(){
    var self = this;
    setInterval(this.print(),100);
},
print:function(){
    console.log('print '+ this.apple + ' - ' + this.orange + ' - ' + this.pie);
}    

输出:未定义

如果我将 this 作为函数的参数传入,则间隔只调用一次并停止。

apple:'apple',
orange:'orange',
pie:'pie',
initialize:function(){
    var self = this;
    setInterval(this.print(this),100);
},
print:function(self){
    console.log('print '+ self.apple + ' - ' + self.orange + ' - ' + self.pie);
}    

输出:打印苹果 - 橙 - 派(之后停止)

在我调用 setinterval 之后,我将如何访问“this”变量?

这是jsfiddle 示例

4

4 回答 4

3

使用匿名函数调用使用 self 变量的函数,这将确保函数将在 self 的范围内调用,因此您可以使用 this 直接访问变量

initialize:function(){
    var self = this;
    setInterval(function() { self.print() },100);
},
print:function(){
    console.log('print '+ this.apple + ' - ' + this.orange + ' - ' + this.pie);
    //console.log(apple);
    //console.log(apple);
}

http://jsfiddle.net/RHqk6/2/

于 2012-07-18T07:06:38.527 回答
2
setInterval(_.bind(this.print, this), 100);

http://jsfiddle.net/bwB9W/21/

于 2012-07-18T06:59:22.030 回答
0

我今天遇到了这个问题,但在 mozilla.org 上找到了一个很好的解释,解释了这个问题和不同的解决方案:

来自 https://developer.mozilla.org/en-US/docs/DOM/window.setInterval#The_.22this.22_problem

解释

由 setInterval() 执行的代码在与调用它的函数不同的执行上下文中运行。因此,被调用函数的 this 关键字将被设置为窗口(或全局)对象,它不会与调用 setTimeout 的函数的 this 值相同。请参阅以下示例(实际使用 setTimeout() 而不是 setInterval() - 实际上两个计时器的问题是相同的):

他们在那里有一个对我有用的解决方案

一个可能的解决方案

解决“this”问题的一种可能方法是将两个本地 setTimeout() 或 setInterval() 全局函数替换为两个非本地函数,这将通过 Function.prototype.call 方法启用它们的调用。以下示例显示了可能的替换:

// Enable the passage of the 'this' object through the JavaScript timers

var __nativeST__ = window.setTimeout, __nativeSI__ = window.setInterval;

window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
  var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
  return __nativeST__(vCallback instanceof Function ? function () {
    vCallback.apply(oThis, aArgs);
  } : vCallback, nDelay);
};

window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
  var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
  return __nativeSI__(vCallback instanceof Function ? function () {
    vCallback.apply(oThis, aArgs);
  } : vCallback, nDelay);
};
于 2012-11-17T01:25:17.910 回答
0

您应该使用匿名函数。

apple:'apple',
orange:'orange',
pie:'pie',
initialize:function(){
    var self = this;
    setInterval( function() { self.print() },100);
},
print:function(){
    console.log('print '+ this.apple + ' - ' + this.orange + ' - ' + this.pie);
}   
于 2012-07-18T06:59:04.183 回答