JavaScript 中的递归闭包

Recursive closure in JavaScript

function buildList( list ) {
  var i      = 0;
  var first  = function () {
    console.log( "in" )
    console.log( i );
  }
  var Second = function () {
    console.log( "out" )
    first();
  }
  return Second;
}

var a = buildList( [1, 2, 3] )
console.dir( a );

a(); // Here closure is created which has function first ,Here first also has one closure of itself that means recursive closure

当我在 Chrome 中看到我的控制台时,它有一个首先具有函数的闭包,它也有一个自身的闭包,即它在闭包中有其自身函数的重复循环,有谁知道这里发生了什么,我很困惑,为什么会有无限闭环

开发者工具显示变量a,它是一个指向匿名的变量function/closure。

在javascript中,一个函数定义在一个作用域中,它也可以通过它的主体块来定义一个作用域。范围 "knows" 定义块内的所有变量以及在函数外部定义但在范围层次结构中定义范围的所有变量。

工具会显示返回函数的范围(在本例中为 a)。函数 first 定义在函数 a 的范围内。

变量 first 在您分配给变量 first 的匿名函数范围内也是已知的。

您在屏幕上看到的内容:first 是一个包含函数的变量。在此函数的范围内,已知变量 first 指向一个函数。在这个功能的范围内...

看到了吗?

closure是一种特殊的对象,它结合了两件事:一个函数,以及创建该函数的环境。

  1. 无需混淆,此代码的行为与预期的相同。这里发生的事情是,当你在你的代码中执行 console.dir( a ); 它 returns Second 函数时,我认为你很清楚。

  2. 现在,当您展开此函数时,它会在 Closure 中显示 Second 的父函数 (environment function),即 buildList.在您的代码中,它正在做同样的事情。

  3. 现在下一步就是展开这个functionbuildList,它会显示给你的是它的子对象,它们是var i = 0;function first。您的控制台按预期显示。

  4. 现在再次打开 first() 时,它会在 Closure 中显示 first 的父函数 (environment function),即 buildList。 (与第 2 步相同)。

现在它再次重复第 3 步,然后重复第 4 步。依此类推... 也许你明白这里发生了什么。