0

重複の可能性:
正しい「this」コンテキストを setTimeout コールバックに渡しますか?

小さなスクリプトに問題があります。

function test() {
    this.arr = new Array('a','b','c');
    this.func = function() {
        //Do something with this.arr. But it's undefined.. WHY???
    }
    this.Start = function() {
        this.Interval = setInterval(this.func, 1000);
    }
}

var Test = new test();
Test.Start();

「func」で配列を使用して何かをしようとすると、配列が未定義であることがわかります。なんで?

4

2 に答える 2

1

間違ったthis参照を取得しています。試してください。

function Test() {
  this.arr = new Array('a','b','c');
  this.func = function() {
    console.log(this.arr);
  };
  this.start = function() {
    var fun = this.func.bind(this);
    this.interval = setInterval(fun, 1000);
  };
}

var test = new Test();
test.start();

この記事thisは、より多くの情報が必要な場合に非常に興味深いものです。関数の呼び出しとこれ

また、一部の記号の大文字と小文字を変更したことに注意してください。コンストラクターとして使用されることを意図した関数は大文字で始まり、変数とメソッドは小文字を使用することを忘れないでください。

于 2012-08-05T19:50:26.653 に答える
1

タイマー/間隔はグローバルスコープで呼び出されるため、「this」は「window」に設定されます。これを回避するには、3番目のオプションをsetInterval()に渡すことができます。これは、指定された関数呼び出しのパラメーターとして使用されます。

function Test(){
    this.array = new Array('a','b','c');
    this.function = funct(){ }
    this.start = function(){
        this.Interval = setInterval(function(passedObj){
            passedObj.funct.call(passedObj);
        },1000,this);
    }
}
var testObj = new Test();
testObj.start();

以下のコメントを読むと、これはnodejs用であることがわかります。ただし、これはIE8以前では機能しません。

于 2012-08-05T19:53:18.847 に答える