コールバックで「this」をバインドしないと、setTimeout でコンテキストが失われるのはなぜですか。
以下のコードでは、onTime が 3 つの場所で呼び出されていることがわかります。
クラスの中から一度。これはうまくいきます。
クラスの外から一度。これはうまくいきます。
タイマーがコールをトリガーしたときに 1 回。「this」には bind メソッドが必要です。
すべてのコールバックでバインドを使用せずにコンテキストを強制する方法はありますか?
var MyBaseClass = function () {
"use strict";
this._base = {};
this._base.baseFunc = function () {
console.log('baseFunc called')
};
return this._base;
};
var TestClass = function () {
"use strict";
if (TestClass.prototype._singletonInstance) {
return TestClass.prototype._singletonInstance;
}
TestClass.prototype._singletonInstance = this;
this._timer = {};
console.log('constructor')
};
TestClass.prototype = new MyBaseClass(); // Set prototype to MyBaseClass
TestClass.prototype.constructor = TestClass; // Set constructor back to TestClass
TestClass.prototype.onTime = function () {
"use strict";
console.log('ontime called')
console.log(this, "<--- why do i lose context")
this.baseFunc()
}
TestClass.prototype.init = function () {
"use strict";
console.log('local')
this.onTime()
//this._timer = setTimeout(this.onTime.bind(this),500)// works
this._timer = setTimeout(this.onTime, 500) // no work
};
var asdf = new TestClass()
asdf.init()
console.log('global')
asdf.onTime()