Javascript JS解释器如何知道何时放弃函数';s变量范围
我有一个关于JS脚本的基本问题。说到这个Javascript JS解释器如何知道何时放弃函数';s变量范围,javascript,Javascript,我有一个关于JS脚本的基本问题。说到这个 var myClass = { foo: function() { var memoryConsumingVariable = [...]; someAsyncFunction(function(x){ doStuff(); } }, bar: function() { var memoryConsumingVariable = [...]; doStuff(); } } 当然,每次
var myClass = {
foo: function() {
var memoryConsumingVariable = [...];
someAsyncFunction(function(x){
doStuff();
}
},
bar: function() {
var memoryConsumingVariable = [...];
doStuff();
}
}
当然,每次我调用myClass.foo()或myClass.bar()时,解释器都会为此调用创建一个新的变量范围。在调用bar()时,事情很清楚。。函数完成后,解释器可以轻松删除作用域,从内存中删除memoryConsumingVariable,因为不再存在对变量的引用
但是调用foo()怎么样?解释器如何知道何时不再需要这个作用域?someAsyncFunction()可以更频繁地调用其回调函数,或者将其作为回调函数本身传递给另一个函数
非常感谢。假设实际代码如下所示:
var myClass = {
foo : function() {
var memoryConsumingVariable = [...];
someAsyncFunction(function(x){
doStuff();
});
},
bar : function() {
var memoryConsumingVariable = [...];
doStuff();
}
}
调用myClass.foo()
时,memoryConsumingVariable
将留在内存中,而匿名函数函数(x){doStuff();}
也在内存中。垃圾收集器无法删除memoryConsumingVariable
,因为它位于匿名函数的可访问环境中
如果没有更多的指针可以访问该匿名函数,垃圾收集器将删除该匿名函数,然后将删除
memoryConsumingVariable
,因为再也没有人可以访问它了。假设实际代码是以下代码:
var myClass = {
foo : function() {
var memoryConsumingVariable = [...];
someAsyncFunction(function(x){
doStuff();
});
},
bar : function() {
var memoryConsumingVariable = [...];
doStuff();
}
}
调用myClass.foo()
时,memoryConsumingVariable
将留在内存中,而匿名函数函数(x){doStuff();}
也在内存中。垃圾收集器无法删除memoryConsumingVariable
,因为它位于匿名函数的可访问环境中
如果没有更多的指针可以访问该匿名函数,垃圾收集器将删除该匿名函数,然后删除
memoryConsumingVariable
,因为再也没有人可以访问它了。您的javascript错误,无法编译。你能纠正它吗?您使用了=
而不是:
,并且遗漏了括号。垃圾收集不会处理foo
,因为它是在没有var
的情况下定义的,因此将其提升到全局范围。@SterlingArcher:它根本没有定义,因为=
是一个语法错误。是的,我应该澄清一下:如果它不在对象内部,并且是合法语法*@Fabian:函数持有对其外部词汇环境的引用,所以将每个范围都视为一个对象,每个嵌套作用域都有一个指向其外部作用域的指针。这形成了一个树结构,因此它们可以只引用count。至于具体实现的实际机制,我不知道。你的javascript是错误的,无法编译。你能纠正它吗?您使用了=
而不是:
,并且遗漏了括号。垃圾收集不会处理foo
,因为它是在没有var
的情况下定义的,因此将其提升到全局范围。@SterlingArcher:它根本没有定义,因为=
是一个语法错误。是的,我应该澄清一下:如果它不在对象内部,并且是合法语法*@Fabian:函数持有对其外部词汇环境的引用,所以将每个范围都视为一个对象,每个嵌套作用域都有一个指向其外部作用域的指针。这形成了一个树结构,因此它们可以只引用count。至于特定实现的实际机制,我不知道。@Magnus,GC如何管理可访问的数据?我听说有一个对包含数据的环境/堆的隐藏引用。是这样吗?你能详细解释一下吗?对不起,我不是垃圾收集器的专家。我只知道它是这样工作的,但我不知道它内部是如何处理的。@Magnus,GC是如何管理可访问的数据的?我听说有一个对包含数据的环境/堆的隐藏引用。是这样吗?你能详细解释一下吗?对不起,我不是垃圾收集器的专家。我只知道它是这样工作的,但我不知道它是如何处理它的内在。