抱歉,如果我的术语有点偏离...当一个函数包装另一个函数并创建一个闭包时,每次调用外部函数时是否都会创建一个新的闭包实例(“内存空间”?)?
根据我的代码,我认为答案是肯定的:
(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
值。
难道不仅仅是我的术语让人困惑吗?
最佳答案
Is a seperate closure instance created for each nested function?
是的,这是一个理想的特性
一个更理想的特性是 block 级作用域,这是 javascript 所没有的。事实上,为了在 javascript 中执行嵌套的 for
循环,滥用嵌套函数是必要的,否则变量绑定(bind)将在你背后发生变异(例如,如果你将它交给回调,您自己演示;想象一下您定义的函数是,例如,不同元素的 onClick 处理程序;您将希望绑定(bind)不同)。
当然,如果您不喜欢此功能,您始终可以使用在外部作用域中定义的变量,就像您所做的那样。 =)
关于javascript - 是否为每个嵌套函数创建了一个单独的闭包实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6145921/