我有一个关于JS脚本的基本问题。说到这个......
var myClass = {
foo: function() {
var memoryConsumingVariable = [...];
someAsyncFunction(function(x){
doStuff();
}
},
bar: function() {
var memoryConsumingVariable = [...];
doStuff();
}
}
当然,每次调用myClass.foo()或myClass.bar()时,解释器都会为此调用创建一个新的变量范围。事情很简单。在函数完成后,解释器可以很容易地删除从内存中删除memoryConsumingVariable的范围,因为不再存在对变量的引用。
但是如何调用foo()?解释器如何知道何时不再需要此范围? someAsyncFunction()可以更频繁地调用它的回调,或者将它作为回调本身传递给另一个函数。
非常感谢。
答案 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
,因为没有人可以再访问它。