我知道闭包中的代码可以访问变量&方法和争论范围链, 但如果它不使用任何一个会发生什么?那些变量仍然保留吗?
考虑这种情况:
function f(){
var a=[];
for(var i=0;i<1000000;i++) a.push({});
return function(){
alert('Hi');
};
}
var x = f();
变量a
是否保留在内存中,即使闭包没有使用它?
由于
更新: 似乎没有关于'琐碎'封闭的答案。 因此,假设每个闭包(即使它什么都不做)可以在内存中保留范围链中的所有方法,包括它们的参数,变量和内部函数(直到闭包被垃圾收集),这是公平的吗?
此外,关于node.js的“可能重复”的问题 - 据我所知node.js仅在基于google的v8 JS引擎的专用环境上运行。在这里,我谈论的是将在任何现代浏览器中运行的网络应用程序(在大多数情况下)
答案 0 :(得分:5)
当解释器选择释放它占用的内存是一个实现细节 - 没有单一的JavaScript解释器。
请注意,解释器并不总是可以知道变量未使用:
function f() {
var a = 123
return function(x) {
alert(eval(x)); // if there's an eval, we have to hold onto all local variables
};
}
f()('a')
在Chrome控制台中试验
var e = eval
var f = function(){
var a = 123;
return function() {
return eval('a');
};
};
var g = function(){
var a = 123;
return function() {
return e('a');
};
};
f()() // 123
g()() // ReferenceError
V8似乎正在根据eval的现状进行优化