6

在此处输入图像描述

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 中看到我的控制台时,它有一个首先具有函数的闭包,它本身也有一个闭包,即它在闭包中有自己的函数的重复循环,有谁知道这里发生了什么,我很困惑,为什么会有无限闭环

4

2 回答 2

2

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

  1. 无需混淆,此代码的行为与预期相同。这里发生的情况是,当您console.dir( a );在代码中执行此操作时,它会返回该Second函数,我认为这对您来说很清楚。

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

  3. 现在下一步是扩展 this function buildList,它会显示它的子对象,它们是var i = 0;function first. 您的控制台按预期显示。

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

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

于 2016-12-23T09:25:05.660 回答
0

开发人员工具显示变量 a,它是一个指向匿名函数/闭包的变量。

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

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

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

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

你看?

于 2016-12-23T09:10:50.887 回答