我有一个看起来像这样的JS对象:
return {
foo: function() {
return this.bar();
},
bar: function() {
return 1;
}
}
为什么我一直登录TypeError: this.bar is not a function
登录FireBug?在同一个对象中引用bar()
方法的正确方法是什么?
所以我发布了整个代码here的小提琴。返回调用实际上是RequireJS foo()
的一部分。如果需要进一步澄清,请与我们联系。
答案 0 :(得分:3)
这取决于它的调用方式;如果将theObject.foo
作为回调传递给另一个函数(例如jQuery(x).on("click", theObject.foo)
),则this
上下文可能会丢失。
强制执行bar
调用foo
的方法是关闭。将返回对象的函数更改为:
function thatReturnsTheOject() {
var ret = {
foo: function() {
return ret.bar(); // <---- Using `ret` not `this`
},
bar: function() {
return 1;
}
};
return ret;
}
另一种方式,更复杂但可能导致更熟悉的语言使用是这样的:
function thatReturnsTheOject() {
var ret = {};
ret.foo = (function() {
return this.bar(); // <---- Using `this` again
}).bind(ret); // <---- but note the `bind()`
ret.bar = function() {
return 1;
};
return ret;
}