0

次のような JS オブジェクトがあります。

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

  bar: function() {
    return 1;
  }
}

TypeError: this.bar is not a functionログインした FireBugが何度も発生するのはなぜですか? 同じオブジェクトbar()からメソッドを参照する適切な方法は何ですか?foo()

アップデート

そのため、コード全体のフィドルをここに投稿しました。return 呼び出しは、実際には 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 に答える