我有一个案例,如果满足某些条件并且我收到错误,我想模拟一个函数。
这是有条件地选择是否模拟函数的函数
MyClass.prototype.methodOne = function (callback) {
var self = this;
var methodTwo = this.methodTwo;
if (someCondition) {
methodTwo = function(callback) {
callback(null);
};
}
methodTwo(function (err) { });
}
MyClass.prototype.methodTwo = function (callback) {
var self = this;
var batch = new Batch();
batch.concurrency(this.options.concurrency); ----> error here
// some more stuff
callback(err);
}
错误讯息为Uncaught TypeError: Cannot read property 'concurrency' of undefined
如果不是拨打methodTwo(function (err) { });
而是拨打this.methodTwo(function (err) { });
,那么一切正常。
答案 0 :(得分:1)
var methodTwo = this.methodTwo;
将方法分配给变量时,函数会丢失其上下文,this
不再引用原始对象。试试这个:
MyClass.prototype.methodOne = function (callback) {
if (someCondition) {
this.methodTwo = function(callback) {
callback(null);
};
}
this.methodTwo(function (err) { });
}
如果您不想永久覆盖methodTwo
,请使用Function.prototype.bind
:
MyClass.prototype.methodOne = function(callback) {
var methodTwo = this.methodTwo.bind(this);
if (someCondition) {
methodTwo = function(callback) {
callback(null);
};
}
methodTwo(function(err) {
});
}
例如,
var o = {
a: 'asdf',
oMethod: function () {
return this.a;
}
};
在这里,如果您将oMethod
分配给变量,则调用它会导致undefined
var oMethod = o.oMethod;
oMethod(); //undefined
var oMethod = o.oMethod.bind(o);
oMethod(); //asdf