0

我有一个看起来像这样的 JS 对象:

return {
  foo: function() {
    return this.bar();
  },

  bar: function() {
    return 1;
  }
}

为什么我不断收到TypeError: this.bar is not a function登录的 FireBug?在同一个对象中引用该bar()方法的正确方法是什么?foo()

更新

所以我在这里发布了整个代码的小提琴。返回调用实际上是 RequireJS 的一部分define。让我知道是否需要进一步澄清。

4

1 回答 1

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;
}
于 2013-10-31T07:50:43.203 回答