Javascript闭包是否始终保留范围变量?

时间:2013-09-19 00:16:13

标签: javascript memory closures

我知道闭包中的代码可以访问变量&方法和争论范围链, 但如果它不使用任何一个会发生什么?那些变量仍然保留吗?

考虑这种情况:

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引擎的专用环境上运行。在这里,我谈论的是将在任何现代浏览器中运行的网络应用程序(在大多数情况下)

1 个答案:

答案 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的现状进行优化