Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS解释器如何知道何时放弃函数';s变量范围_Javascript - Fatal编程技术网

Javascript JS解释器如何知道何时放弃函数';s变量范围

Javascript JS解释器如何知道何时放弃函数';s变量范围,javascript,Javascript,我有一个关于JS脚本的基本问题。说到这个 var myClass = { foo: function() { var memoryConsumingVariable = [...]; someAsyncFunction(function(x){ doStuff(); } }, bar: function() { var memoryConsumingVariable = [...]; doStuff(); } } 当然,每次

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

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是如何管理可访问的数据的?我听说有一个对包含数据的环境/堆的隐藏引用。是这样吗?你能详细解释一下吗?对不起,我不是垃圾收集器的专家。我只知道它是这样工作的,但我不知道它是如何处理它的内在。