函数调用无法在回调中工作

时间:2014-03-09 17:50:01

标签: javascript callback prototype

我用自己的原型函数和成员变量创建了一个对象。如果我这样做:

var obj = new MyObject(options); // this.options takes the value of options
obj.doThis();
obj.doThat();

......然后一切都很好。但如果我这样做:

var obj = new MyObject(options);
obj.doThis();
setTimeout(obj.doThat, 3000);

...然后在doThat被解雇时崩溃。错误报告在构造函数中设置的optionsundefined。这两个函数被添加到原型中,如:

MyObject.prototype.doThat = (function() {
    ...
    ...
})();

我是Javascript初学者,所以任何帮助都表示赞赏。

2 个答案:

答案 0 :(得分:1)

下面:

setTimeout(obj.doThat, 3000);

您正在传递功能而只传递该功能。 obj的背景已丢失。

您需要创建(并传递)在doThat上下文中调用obj的新函数。

The bind method会这样做。

setTimeout(obj.doThat.bind(obj), 3000);

(注意,limited browser support,填充可在上面的链接中找到)

答案 1 :(得分:1)

当您致电setTimeout(obj.doThat, 3000)时,doThat未绑定obj。这只是一个免费的功能。 this通过调用:

绑定在JavaScript中
f(); // this is undefined or the global object, depending on strict mode
x.f(); // this is x
x['f'](); // this is still x
f.call(x, arg1, arg2); // this is, again, x
f.apply(x, [arg1, arg2]); // guess
但是,ECMAScript 5确实提供了一个函数函数来返回一个函数来调用具有特定this的函数。它被称为bind

setTimeout(MyObject.prototype.doThat.bind(obj), 3000);