0

私は次の機能を持っています:

  function a() {
    var d = {
      foo : "text"
    };
    for(var b in c) {
      if(c.hasOwnProperty(b)) {
        d[b] = function() {
          return c[b].apply(this, arguments);
        };
      }
    }
    return d;
  }

  var c = {
    a : function() { alert(this.foo); },
    b : function() { return this.a(); }
  }

  a().a(); // nothing happens

  // but the following works :
  var c = {
    a : function() { alert(this.foo); }
  }

  a().a(); // output : text

thisこれは.applyメソッドのせいで起こると思います。どうすればこれを修正できますか?

4

2 に答える 2

1

関数「a」のイテレータ変数「b」が各クロージャーで共有されているため、機能していません。

これを試して:

for(var b in c) {
  if(c.hasOwnProperty(b)) {
    d[b] = function(b) {
      return function() { return c[b].apply(this, arguments); };
    }(b);
  }
}

これはjsfiddleとしての作業バージョンです。

于 2012-08-23T15:01:08.773 に答える
0

a() はグローバル スコープで実行されます。c[b].apply(this, arguments) を呼び出すと、グローバル スコープでも実行されます。for ループは後ろから前に反復し、最初に b に遭遇し、b をグローバル スコープで実行します。これはグローバル スコープで a を呼び出します。これは c をループし、グローバル スコープで b を呼び出します。...

結果: RangeError: 最大コール スタック サイズを超えました

于 2012-08-23T15:06:01.800 に答える