繁体   English   中英

是否为每个嵌套的 function 创建了单独的闭包实例?

[英]Is a separate closure instance created for each nested function?

抱歉,如果我的术语有点不对劲...当一个 function 包装另一个并创建一个闭包时,每次调用外部 function 时是否会创建一个新的闭包实例(“内存中的空间”?)?

从我的代码中,我相信答案是肯定的:

(function(){
  var ob = {}, names=['one', 'two'], i=0;

  var outer = function(val){

    ob[names[i++]] = function(){
      return val;
    };

  };

  outer(3);
  outer(999);

  console.log(ob.one());
  console.log(ob.two());
})();

鉴于结果是

3
999

而不是

999
999

似乎ob.one指向与ob.two不同的闭包实例 - 每个都有自己的val值。

是否比我的术语更混乱?

是否为每个嵌套的 function 创建了单独的闭包实例?

是的,这是一个理想的功能

一个更理想的特性是块级作用域,这是 javascript 所没有的。 事实上,为了在 javascript 中执行嵌套for循环,有必要滥用嵌套函数,否则变量绑定将在您背后发生变异(例如,如果您将其交给回调,您自己演示;想象一下例如,您定义的函数是针对不同元素的 onClick 处理程序;您会希望绑定不同)。

当然,如果你不喜欢这个特性,你总是可以使用你在外部 scope 中定义的变量,就像你一样。 =)

如果ob被称为inner会更好,但无论如何......

...每次调用外部 function 时是否会创建一个新的闭包实例(“内存中的空间”?)?

是和不是。 分配给外部的 function 具有外部匿名 function 的激活/变量 object 的闭包。 当调用外部时,object 被放置在其 scope 链上,用于标识符解析。 每次都是相同的 object(ECMA-262 没有说明如何完成,但出于所有意图和目的,它是同一个对象)。

分配给ob[names[i++]]的 function 对调用外部时创建的激活/变量 object 的实例有一个闭包,并分配了 function。 So each time outer is called, a new activation/variable object is created and each ob[..] function has a closure to a different outer activation/variable object but the same anonymous function activation/variable object.

我希望这是有道理的。

鉴于结果是

3 999

而不是

999 999

似乎 ob.one 指向与 ob.two 不同的闭包实例 - 每个都有自己的 val 值。

这两个函数在它们的 scope 链上具有相同的匿名 function 激活/变量 object,因此“共享”一个闭包给obj名称i 但是每个作为外部激活/变量 object 在其 scope 链上的唯一实例,因此val将解析为相同的属性名称但在不同的对象上(即它们不共享相同的val属性)。

也许下面的 scope 链图是有意义的:

ob.one -> outerA -> anonymous fn -> global
ob.two -> outerB -> anonymous fn -> global

所以ob.oneob.two在它们的 scope 链上有一个外部实例,但它们是不同的实例。 他们在 scope 链上有相同的匿名 function 和全局对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM