在Javascript中重复关闭

时间:2016-12-23 07:48:37

标签: javascript closures lexical-scope lexical-closures

enter image description here

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

2 个答案:

答案 0 :(得分:2)

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

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

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

  3. 现在接下来要展开这个function buildList,它会告诉你的是它的子对象,var i = 0;function first 。您的控制台正在按预期显示。

  4. 现在再次打开first()时,它会显示Closure environment function的{​​{1}}的父函数firstbuildList 。 (与第2步相同)。

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

答案 1 :(得分:0)

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

在javascript中,函数在作用域中定义,也可以通过其body块定义作用域。范围“知道”定义块内的所有变量以及在函数外部定义但在范围的层次结构中定义的所有变量。

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

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

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

你知道吗?