0

我正在尝试学习 JS 并且关于 javascript 闭包我有一个问题 -

function fooOuter(){
   var a = 10;
   var b = 20;
   return function fooinner(x){
      return a + b + x;
   };
}

这是否意味着 Javascript 中的内部函数存储对位于同一范围内的所有变量的引用。即在这种情况下,fooinner 是否存储变量a 和b 的引用。

4

4 回答 4

3

实际上,是的。运行时创建了一个所谓的“作用域链”,链中的链接只有在不再被引用时才会被释放。 fooinner()有自己的作用域,有一个“父作用域”链接到 的作用域fooOuter(),依此类推——这就是fooinner()作用域链。

因此,由它使用fooinner()和在其外部定义的变量将继续存在,至少只要该特定函数对象存在。

于 2013-04-10T18:42:44.017 回答
0

fooInner 将为返回的每个 fooInner 实例保留 a 和 b 的值。换句话说,每个函数将等于 10 + 20 + x。实际上,它是一个闭包和一个部分。

于 2013-04-10T18:42:09.440 回答
0

这是我从培训中得到的一些事实。我希望这有帮助

创建函数时,会为其分配一个 [[scope]] 属性,该属性引用外部词法范围的变量并防止它们被垃圾收集。因此,闭包是在函数创建时形成的。

闭包引用变量而不是值。由于每个函数调用都发生在唯一的执行上下文中,因此我们保证参数变量在连续调用中的唯一性。

需要注意的是,每个函数的闭包创建过程都是相同的,每个函数都会创建一个闭包

于 2013-04-10T18:43:00.833 回答
0

是的,它几乎可以做到这一点。

简单地说,闭包就是一个可以访问其父上下文数据的上下文。在 Stackoverflow 或 Web 上都有很多很好的解释。

但无需详细说明,当你的内部函数被解析时,ECMAscript 解释器在内部设置了一个到外部函数的链接(我们分别fooinner称其为Activation Object和Lexical Environment Record)。

于 2013-04-10T18:43:33.397 回答