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

ECMA-262、第5版で実装されていることに注意してくださいbind。したがって、クロスブラウザーの互換性のために、これを追加する必要があります。

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
  • まず、タイムアウト コールバックに文字列ではなく関数参照を使用します。文字列を使用するthis場合はグローバルオブジェクトであり、それを提供した可能性があるものではありません。

  • 次に、 の値をキャッシュします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 に答える