我用自己的原型函数和成员变量创建了一个对象。如果我这样做:
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
被解雇时崩溃。错误报告在构造函数中设置的options
为undefined
。这两个函数被添加到原型中,如:
MyObject.prototype.doThat = (function() {
...
...
})();
我是Javascript初学者,所以任何帮助都表示赞赏。
答案 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
通过调用:
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);