1

メソッドが setImmediate を介して再帰的かつ非同期的に自分自身を呼び出さなければならない状況があります。

次のコードは元のコードとは関係ありませんが、同じ「問題」が発生します。「this」参照は 2 回目の呼び出しで失われたようです。

function A () {
   this.some_message = 'Index is: ';
}

A.prototype.someMethod = function (index) {
  console.log(`${this.some_message} ${index}`);
  setImmediate(this.someMethod, index + 1);
}

次の出力があります。「this.someMethod」は、ある時点で関数ではなくなりますが、理解できません。

> new A().someMethod(1)
Index is:  1
undefined
> undefined 2
TypeError: "callback" argument must be a function
    at exports.setImmediate (timers.js:664:11)
    at Immediate.A.someMethod (repl:3:1)
    at runCallback (timers.js:639:20)
    at tryOnImmediate (timers.js:610:5)
    at processImmediate [as _immediateCallback] (timers.js:582:5)
> 

メソッドの最後の行を次のように変更して解決しました。

setImmediate(this.someMethod.bind(this), index + 1);

しかし、 setImmediate がそのように動作する理由がわかりません。誰かが私にそれについてのリンクを提供できますか? どんな助けでも本当に感謝します。私は答えを見つけようとして数時間過ごしました。前もって感謝します。

-- 編集: また、より良いタイトルまたは編集を自由に提案してください。私は英語のレベルがかなり低いです。

4

1 に答える 1

3

高階関数を使用しているときはいつでも、コンテキスト失われます。3 つのオプションがあります: ref をthisクロージャーに格納する、渡す関数をバインドする、または を使用しないthisです。

// using Function.prototype.bind
var foo = { value: 3 };
foo.method = function() { return this.value };

function doesAsync() {
  setImmediate(foo.method.bind(foo));
}

// using a closure
var bar = {
  value: 3,
  method: function() {
    var self = this;
    setImmediate(function() {
      alert(self.value);
    });
  }
};
于 2016-10-24T17:28:16.880 に答える