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组件侦听器)