“这个”功能无效的范围

时间:2012-08-23 14:52:28

标签: javascript

我有以下功能:

  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。我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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);
  }
}

Here is the working version as a jsfiddle.

答案 1 :(得分:0)

a()在全局范围内执行。当你调用c [b] .apply(this,arguments)时,它也会在全局范围内执行。 for循环从前到后迭代,它首先遇到b,它在全局范围内执行b,它在全局范围内调用a,循环遍历c,在全局范围内调用b,...

结果:RangeError:超出最大调用堆栈大小