在Javascript中,即使不使用该变量,闭包是否也会捕获该变量?

在Javascript中,即使不使用该变量,闭包是否也会捕获该变量?,javascript,garbage-collection,closures,Javascript,Garbage Collection,Closures,也许这是个愚蠢的问题,但我找不到答案。假设我们有这样的代码: function makeFunc() { var name = 'Billy'; var unusedVariable = 'unused'; function displayName() { alert(name); } return displayName; } var myFunc = makeFunc(); 据我所知,在本例中,当变量name上没有引用时,将收集该变量,因此它将在闭包myFun

也许这是个愚蠢的问题,但我找不到答案。假设我们有这样的代码:

function makeFunc() {
  var name = 'Billy';
  var unusedVariable = 'unused';
  function displayName() {
    alert(name);
  }
  return displayName;
}

var myFunc = makeFunc();

据我所知,在本例中,当变量
name
上没有引用时,将收集该变量,因此它将在闭包
myFunc
存在时有效。但是
unusedVariable
myFunc
存在的时候会存在吗?换句话说,displayName()是否“捕获”了这个
unusedVariable
,即使它未使用?

是。在“makeFunc”范围内创建的所有变量都将存在于闭包中,无论是否使用。准确地说,这就是结束的含义。在“displayName”中,您可以(而不是“必须”)引用这两个变量。

因为即使未使用,它也会在外部范围的内存中。它取决于实现。它不是那么简单。现代引擎会尽可能优化掉未引用的变量。是的。你说得对。我用firebug验证了。未使用的变量被排除在关闭范围之外。只有使用过的变量保留在范围内。也许最新的浏览器这样做是为了更好的内存管理和性能。是的,现代引擎有很多这样的优化。在您的测试中,在返回的函数中放入一个
eval()
调用,从文本字段中评估输入,我敢打赌所有变量都将保留。