Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript &引用;这";函数的作用域无效_Javascript - Fatal编程技术网

Javascript &引用;这";函数的作用域无效

Javascript &引用;这";函数的作用域无效,javascript,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 = {

我有以下功能:

  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

我认为发生这种情况是因为
方法中的
这个
。如何修复此问题?

它不起作用,因为函数“a”中的迭代器变量“b”被每个闭包共享

试试这个:

for(var b in c) {
  if(c.hasOwnProperty(b)) {
    d[b] = function(b) {
      return function() { return c[b].apply(this, arguments); };
    }(b);
  }
}
a()在全局范围内执行。调用c[b].apply(这个参数)时,它也在全局范围内执行。for循环从前到后迭代,它首先遇到b,它在全局范围内执行b,在全局范围内调用a,在c上循环,在全局范围内调用b


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

Oh god。你为什么要写这么复杂的行为@Florent只是为了让生活更简单…函数a()将被使用100或1000次,所以我不希望它包含很多大函数,所以我尝试以某种方式将a().a()链接到c.a(),而不是每次都在()函数中创建它。我无法创建全局函数,因为很多函数可能已经由javascript定义。@Florent^^你有翻译器吗?!可能的复制品不是很准确。外部的“a”返回一个具有自己的“a”属性的对象。因此,
a().a()
将导致内部函数将从第一个
a()
返回的对象作为其
引用。是的,我在发布后注意到了这一点,但我认为在答案中添加另一层间接性无助于澄清问题。