内存分配使用";新";在Javascript中

内存分配使用";新";在Javascript中,javascript,object,creation,Javascript,Object,Creation,关于使用Javascript创建动态对象,我有几个基本问题。 我知道浏览器负责为JS中的任何“新”关键字分配内存空间。如果我的理解是正确的,那么我将逐一提出以下问题 查询#1:“示例”函数中的两行,请参考下面给出的注释。这是我的第一个问题 function sample() { var a = 5; // is the memory allocated for variable 'a' in stack ? var b = new obj1(); // The object i

关于使用Javascript创建动态对象,我有几个基本问题。 我知道浏览器负责为JS中的任何“新”关键字分配内存空间。如果我的理解是正确的,那么我将逐一提出以下问题

查询#1:“示例”函数中的两行,请参考下面给出的注释。这是我的第一个问题

function sample() {
  var a = 5;      // is the memory allocated for variable 'a' in stack ?
  var b = new obj1(); // The object instance created for 'obj1' gets allocated in heap?
}

var obj1 = function() {
  this.strDate = "";
}
查询#2:一旦执行范围超出函数sample(),浏览器引擎将释放为这两个变量分配的内存。我读过GC的参考算法&标记和扫描算法 以及建议在不使用时将变量分配给变量,但不能对我们将在C++中遵循的标准有一个明确的概念。若堆栈中有变量a,那个么我就不必担心了 如果obj1实例不再可访问,或者说未标记或不再进一步引用它,它也会被GC清除吗

查询#3:浏览器在为使用“new”操作符创建的实例分配和释放内存方面是否有所不同。(我在chrome中只看到了堆分析器,与之相关的术语很少,但我也遇到了“堆栈外空间”错误。这是否意味着所有浏览器都会普遍使用堆栈和堆

请帮帮我;)

  • 作为程序员,在JavaScript中,您无法控制堆栈或堆分配。您可以创建位于内存中某个位置的对象或基本体。内部JS引擎(如V8或Spidermonkey)执行各种优化。一般来说,您可以将所有内容都视为存储在堆中
  • 要开始,您需要知道GC将从未引用的对象中释放内存。当您在代码中的某个地方持有对对象的引用时,它不会被销毁
  • 浏览器(JS引擎)不会向您泄漏内存分配抽象。您所指的错误可能是调用太多函数(主要是由于递归)时超出了调用堆栈

  • 我很确定,在内存分配方面&GC
    new
    没有特殊意义,您的示例与
    varb={strDate:“}在内存处理方面(除了原型链的额外空间),基本上所有内存分配都由浏览器处理,开发人员不关心。一旦对象不再使用(不再被引用),浏览器将自动对其进行垃圾收集。在某些浏览器中,当不再使用某个变量时,您可以通过将该变量设置为
    null
    来帮助进行早期垃圾收集,尤其是一些较旧的浏览器(尤其是IE)。