[英]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.one和ob.two在它们的 scope 链上有一个外部实例,但它们是不同的实例。 他们在 scope 链上有相同的匿名 function 和全局对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.