如何使用setinterval访问'this'

时间:2012-07-18 06:55:20

标签: javascript

我尝试在实现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 example

4 个答案:

答案 0 :(得分:3)

使用匿名函数使用自变量调用函数,该函数将确保使用self的范围调用函数,以便您可以使用此函数直接访问变量

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/

答案 1 :(得分:2)

setInterval(_.bind(this.print, this), 100);

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

答案 2 :(得分: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);
}   

答案 3 :(得分:0)

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

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

  

解释

     

setInterval()执行的代码在单独的执行上下文中运行   到它被调用的函数。结果,这个   被调用函数的关键字将被设置为窗口(或全局)   对象,它不会与函数的this值相同   这叫做setTimeout。请参阅以下示例(适用于praticity   使用setTimeout()而不是setInterval() - 问题实际上是   对于两个计时器都是一样的):

他们有一个适合我的解决方案

  

可能的解决方案

     

解决“这个”问题的一种可能方法是更换两者   本机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);
};