12

関数 a があるとします。

function a() {
    this.b = 1;
    this.set = setInterval(function() {console.log(this.b);}, 200);
}

したがって、 a.set() が呼び出されると、無名関数が呼び出されます。ただし、関数がトリガーされたときにウィンドウオブジェクトを指すため、これは機能しません。また、複数の a のインスタンスが存在する可能性があるため、ab を使用することはお勧めできません。

この問題の良い解決策は何ですか?

4

6 に答える 6

24

:への参照を保存しthisます

function a() {
    var self = this;
    self.b = 1;
    self.set = setInterval(function() {console.log(self.b);}, 200);
}

渡す匿名関数はsetInterval、それを含むスコープ内の任意の変数、つまり、のローカル変数にアクセスできますfunction a()。JSクロージャの魔法は、これらの変数a()が完了した後も存続し、を呼び出すたびa()に独自のクロージャを取得します。

于 2012-06-08T06:30:20.860 に答える
6

ほとんどの場合、連続するメソッド呼び出しで this コンテキストを実際に切り替えたいため、これが最もクリーンなソリューションです。

    // store scope reference for our delegating method
    var that = this;
    setInterval(function() {
        // this would be changed here because of method scope, 
        // but we still have a reference to that
        OURMETHODNAME.call(that);
    }, 200);
于 2014-11-05T14:46:42.700 に答える
2

this参照を他の変数に保存するだけです。これは、window後で-callによってオーバーライドされません。後で、その変数を使用して、最初に使用したオブジェクトを参照できます。

function a() {
    this.b = 1;
    var that = this;
    this.set = setInterval(function() {console.log(that.b);}, 200);
}
于 2012-06-08T06:29:45.553 に答える
0

あなたの場合、あなたは簡単に次のことができます:

function a() {
    var _this = this;
    this.b = 1;
    this.set = setInterval(function () {
      console.log(_this.b);
    }, 200);
}

通常、参照Function.prototype.bind修正するためのヘルパーメソッドを使用することもできthisます。

于 2012-06-08T06:29:48.783 に答える