【问题标题】:Recursive closure in JavaScriptJavaScript 中的递归闭包
【发布时间】:2017-05-08 21:57:54
【问题描述】:

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

【问题讨论】:

  • 正确格式化和缩进代码真的那么难吗?无论如何,请张贴一张让您感到困惑的 devtools 显示屏幕截图。
  • 我添加了一个scrrenschot
  • 你只是有两个方向的引用,没有循环。 :)

标签: javascript closures lexical-scope lexical-closures


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 但是我没有在我的闭包中看到任何 buildlist 函数??
  • @Parshuram,您执行的代码是否与您发布的问题相同?
  • 是的,先生,但它只是列表变量,而不是 i 没有任何区别,现在请看我的截图
  • 但我仍然没有看到我的父函数关闭
  • @BenAston 给你,我想你需要看看这里。 developer.mozilla.org/en/docs/Web/JavaScript/Closures
【解决方案2】:

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

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

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

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

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

你看到了吗?

【讨论】:

  • 如果你说 first 也有自己的范围,那为什么 second 没有自己的范围,,,???它只有第一个和列表范围??
  • 是的,chrome-debugger 只显示一个范围内的变量,这些变量在这个范围内使用。请参阅屏幕截图输出的第 3 行中的代码文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2011-01-31
  • 1970-01-01
  • 2021-04-01
  • 2018-09-09
  • 1970-01-01
相关资源
最近更新 更多