'这'丢失在setImmediate调用?

时间:2016-10-24 17:25:22

标签: javascript this setimmediate

我遇到一种情况,即方法必须通过setImmediate以递归和异步方式调用自身。

下一个代码与原始代码没有任何关系,但同样的"问题"出现了:"这个"第二次通话似乎丢失了引用。

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会那样。任何人都可以提供一些关于它的链接吗?我真的很感激任何帮助。我已经花了几个小时试图找到答案。提前谢谢。

- 编辑:还可以随意提出更好的标题或编辑。我的英语水平很差。

1 个答案:

答案 0 :(得分:3)

每当您使用高阶函数时,丢失上下文。你有三个选择:在一个闭包中存储引用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);
    });
  }
};