JS解释器如何知道何时放弃函数的变量范围

时间:2015-12-04 15:19:59

标签: javascript

我有一个关于JS脚本的基本问题。说到这个......

var myClass = {
  foo: function() {
    var memoryConsumingVariable = [...];
    someAsyncFunction(function(x){
      doStuff();
    }
  },

  bar: function() {
    var memoryConsumingVariable = [...];
    doStuff();
  }
}

当然,每次调用myClass.foo()或myClass.bar()时,解释器都会为此调用创建一个新的变量范围。事情很简单。在函数完成后,解释器可以很容易地删除从内存中删除memoryConsumingVariable的范围,因为不再存在对变量的引用。

但是如何调用foo()?解释器如何知道何时不再需要此范围? someAsyncFunction()可以更频繁地调用它的回调,或者将它作为回调本身传递给另一个函数。

非常感谢。

1 个答案:

答案 0 :(得分:0)

假设真实代码是以下代码:

foreach($results as $brand) { 
$startsWith = strtolower($brand['brand']);

if( array_key_exists($startsWith, $groups)){
    array_push($groups[$startsWith], $brand);
 }
else 
{
   foreach($results as $res){

       $groups[$startsWith] = Array($res[$startsWith]);

    }
  }
}

当您致电var myClass = { foo : function() { var memoryConsumingVariable = [...]; someAsyncFunction(function(x){ doStuff(); }); }, bar : function() { var memoryConsumingVariable = [...]; doStuff(); } } 时,myClass.foo()将留在内存中,而匿名函数memoryConsumingVariable也在内存中。垃圾收集器无法删除function(x){ doStuff(); },因为它位于匿名函数的可访问环境中。

如果没有更多指针可以访问此匿名函数,垃圾收集器将删除匿名函数,然后删除memoryConsumingVariable,因为没有人可以再访问它。