'this' 在 setImmediate 调用中丢失?
'this' lost in setImmediate call?
我遇到一种情况,方法必须通过 setImmediate 递归地异步调用自身。
下一个代码与原始代码没有任何关系,但出现了相同的 "problem":"this" 引用似乎在第二次调用时丢失了。
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 会这样。任何人都可以提供一些关于它的 link 吗?我真的很感激任何帮助。我已经花了几个小时试图找到答案。提前致谢。
-- 编辑:另外,请随时提出更好的标题或修订。我的英语水平很差
任何时候你使用高阶函数,你都会失去上下文。您有三个选择:在闭包中存储对 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);
});
}
};
我遇到一种情况,方法必须通过 setImmediate 递归地异步调用自身。
下一个代码与原始代码没有任何关系,但出现了相同的 "problem":"this" 引用似乎在第二次调用时丢失了。
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 会这样。任何人都可以提供一些关于它的 link 吗?我真的很感激任何帮助。我已经花了几个小时试图找到答案。提前致谢。
-- 编辑:另外,请随时提出更好的标题或修订。我的英语水平很差
任何时候你使用高阶函数,你都会失去上下文。您有三个选择:在闭包中存储对 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);
});
}
};