1

私はこのようなものを作っています:

var talkAPI = {
    init: function(){
        setInterval(function(){
            this.speak();
        },1000);
    },
    speak: function(){
         //Something else
    }
};

しかし、これが期待どおりに機能していないことがわかりました。そこで、いくつかのテストを行ったところ、 が を参照していることがわかりthisましsetIntervalWindow。そして、これは私が欲しかったものではありません。では、どうすれば を再参照できthisますtalkAPIか? 私はこれをしたくないので:

setInterval(function(){
    window.talkAPI.speak();    //Not so good
},1000); 
4

2 に答える 2

5

thisコールバックで使用するためにオリジナルを保存する必要があります

init: function() {
    var self = this;
    setInterval(function(){
        self.speak();
    },1000);
},
于 2012-04-24T22:44:48.320 に答える
2

問題は、JavaScript では、関数が定義されている場所ではなく、関数が呼び出される方法thisによって完全に定義されることです (他の言語ではそのキーワードが使用されます)。したがって、指定した関数を呼び出す方法は、特定のものに設定されていません (そのため、ブラウザーにあるグローバル オブジェクトにデフォルト設定されます)。詳細はこちら:覚えておく必要がありますsetIntervalthiswindowthis

引用したコードでは、次の 2 つのオプションがあります。

  1. Kolink がコメントしたように、オブジェクトはシングルトンであり、init関数は変数を閉じるtalkAPIため、単に使用できない理由はありませんtalkAPI

    var talkAPI = {
        init: function(){
            setInterval(function(){
                talkAPI.speak();    // <=== Only change is here
            },1000);
        },
        speak: function(){
             //Something else
        }
    };
    
  2. シングルトンとコンストラクター関数などによって作成されたオブジェクトの両方で機能するより一般的な答えは、 JaredPar で説明されているようthisに、の値を保持することです。

    var talkAPI = {
        init: function(){
            var self = this;        // <=== Create a variable to close over
            setInterval(function(){
                self.speak();    // <=== Use it
            },1000);
        },
        speak: function(){
             //Something else
        }
    };
    

どちらの場合も、関数はそれらが閉じるシンボルへの永続的なライブ リンクを持っているため、関数を使用できます。このようにデータがバインドされている関数は、クロージャと呼ばれます。詳細はこちら:閉鎖は複雑ではありません

于 2012-04-24T23:00:46.577 に答える