0

这就是我想要做的,但它不起作用,它显示的错误是:this.run 不是一个函数。上线(this.xId = window.setInterval('this.run()', 2500);)

function(){

   this.run = function(){

      DO SOMETHING;

   }

   this.xId = window.setInterval( 'this.run()', 2500 );

}

可能是什么原因 ?

4

2 回答 2

1

您需要为此传递匿名函数:

this.xId = window.setInterval( function() { this.run() }, 2500 );

或者更好的是将此函数与上下文绑定:this

this.xId = window.setInterval( this.run.bind(this) , 2500 );

请注意,这bind是在 ECMA-262 第 5 版中实现的,因此为了实现跨浏览器兼容性,您需要添加以下内容:

if (!Function.prototype.bind) {  
  Function.prototype.bind = function (oThis) {  
    if (typeof this !== "function") {  
      // closest thing possible to the ECMAScript 5 internal IsCallable function  
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");  
    }  

    var aArgs = Array.prototype.slice.call(arguments, 1),   
        fToBind = this,   
        fNOP = function () {},  
        fBound = function () {  
          return fToBind.apply(this instanceof fNOP  
                                 ? this  
                                 : oThis || window,  
                               aArgs.concat(Array.prototype.slice.call(arguments)));  
        };  

    fNOP.prototype = this.prototype;  
    fBound.prototype = new fNOP();  

    return fBound;  
  };  
}
于 2012-05-24T11:53:18.110 回答
0
  • 首先,超时回调使用函数引用而不是字符串thiswhen using a string 是全局对象,而不是可能提供它的对象。

  • 其次,缓存 的值this。回调中的this可能与它外部的不同(即带有 的那个run)。

    function(){
        var that = this; //cache "this"
    
        this.run = function(){
            //DO SOMETHING;
        }
    
        this.xId = window.setInterval(function(){
            that.run()
        },2500);
    }
    
于 2012-05-24T11:56:21.200 回答