2

我知道闭包中的代码可以访问作用域链上的变量、方法和参数,但是如果它不使用它们中的任何一个会发生什么?这些变量还保留吗?

考虑这种情况:

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

4

1 回答 1

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 的存在进行优化

于 2013-09-19T00:18:23.117 回答