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

Javascript闭包是否总是保留范围变量?,javascript,memory,closures,Javascript,Memory,Closures,我知道闭包中的代码可以访问作用域链上的变量、方法和参数, 但是如果它不使用它们中的任何一个会发生什么呢?这些变量是否仍然保留 考虑这种情况: function f(){ var a=[]; for(var i=0;i<1000000;i++) a.push({}); return function(){ alert('Hi'); }; } var x = f(); 函数f(){ var a=[]; 对于(var i=0;i,当解释器选择释放它所占用的内存

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

考虑这种情况:

function f(){

  var a=[];
  for(var i=0;i<1000000;i++) a.push({});

  return function(){
     alert('Hi');
  };

}

var x = f();
函数f(){
var a=[];

对于(var i=0;i,当解释器选择释放它所占用的内存时,这是一个实现细节——没有单一的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的存在进行优化

你永远不可能真正知道…JS实现可以随心所欲。进行静态代码分析的聪明垃圾收集器可以收集值,但不能保证。可能重复的(及其相关问题)经验法则:For(旧)带有哑垃圾收集器的引擎最好显式设置
a=null
。如果我们只假设相对较新的浏览器,那么这是一个需要担心的问题吗?让我们更清楚地了解正在发生的事情。很高兴看到这方面的规范。不,它不仅看起来是无辜的,而且是无辜的。
g('a')
eval('a'))
为此,请使用不同的计算方法。
g
将在全局范围内计算代码。这是公平的。但我要说的是仅使用参数和/或局部变量的几行琐碎函数。新浏览器是否知道如何处理它,并将其视为全局范围方法?这非常重要,因为我必须这样做用于快速事件处理程序设置的小型闭包(特别是会说话的ExtJs组件侦听器)