function Foo(){
  var someObj = {
    s: 'string'
  }

  console.log(someObj.s);
}

Foo(); // first call
Foo(); // second call
someObj 指向的内存会被覆盖还是会分配一个新的内存?如果将分配新内存,第一次调用时创建的 someObj 会发生什么,垃圾收集器会擦除它吗?我应该在函数外定义 someObj 以减少内存操作次数吗?

最佳答案

每次调用 someObj 都会创建一个新的 Foo 。您可以通过返回对象并查看新对象是否相等来检查这一点:

function Foo(){
  var someObj = {
    s: 'string'
  };
  return someObj;
}
console.log(Foo() === Foo());


它们不一样——第一个 someObj 指向的内存位置与第二个 someObj 指向的内存位置不同。如果您连续调用 Foo 而没有为 GC 运行留出时间,您最终会耗尽内存。

如果对象没有返回,那么在 Foo 运行之后,没有其他东西可以引用 someObj ,所以它很快就会被 GC 处理。

如果您想防止创建多个 someObj ,是的,可以在 someObj 之外定义 Foo

如果您希望 someObj 只能在 Foo 内部引用,同时也只创建一个这样的对象,那么将 Foo 转换为 IIFE:

const Foo = (() => {
  var someObj = {
    s: 'string'
  };
  return () => {
    console.log(someObj.s);
  };
})();

Foo();

关于javascript - 'var' 是否在重新访问或覆盖时分配新内存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56324893/

10-09 21:57