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闭包循环
答案 0 :(得分:2)
closure
是一种特殊的对象,它结合了两个东西:一个函数,以及创建该函数的环境。
无需混淆,行为与此代码的预期相同。这里发生的事情是,当您在代码中执行console.dir( a );
时,它会返回Second
函数,我认为这对您来说很清楚。
现在,当您展开此功能时,它将显示Closure
environment function
的{{1}}的父函数(Second
),即buildList
。在你的代码中,它正在做同样的事情。
现在接下来要展开这个function
buildList
,它会告诉你的是它的子对象,var i = 0;
和function first
。您的控制台正在按预期显示。
现在再次打开first()
时,它会显示Closure
environment function
的{{1}}的父函数first
,buildList
。 (与第2步相同)。
现在它再次重复步骤3,然后再重复步骤4.依此类推...... 可能你明白这里发生了什么。
答案 1 :(得分:0)
开发人员工具显示变量a,该变量是指向匿名函数/闭包的变量。
在javascript中,函数在作用域中定义,也可以通过其body块定义作用域。范围“知道”定义块内的所有变量以及在函数外部定义但在范围的层次结构中定义的所有变量。
这些工具向您显示返回函数的范围(在本例中为a
)。函数first
在函数a
的范围内定义。
变量first
在您分配给变量first
的匿名函数的范围内也是已知的。
你在屏幕上得到的是什么:first
是一个包含函数的变量。在此函数的范围内,已知变量first
指向函数。在这个功能的范围内......