Javascript关注在已存在的变量上使用'var'

Jac*_*nkr 7 javascript memory memory-management

比方说,我开始了var一个Object在我的代码

var base = {x:Infinity, y:Infinity};

后来我在同一范围内

var base = {x:0, y:0}

我知道我可以重用现有的变量,但我试图迭代一点.

  1. 就内存而言,这是否会导致当前范围出现任何问题?
  2. 如果它们在不同的范围内会有任何问题吗?
  3. 一般规则是永远不要在已存在的变量上使用var吗?
  4. 如果我做了几次(数千次),我会遇到任何"时髦"的问题吗?

Rig*_*red 7

  1. 它释放了对旧值的保留,因此可能会被垃圾收集.我可能会说,因为对象可以被不同的变量引用.

  2. 如果它们位于不同的范围内,则内部base将遮蔽外部范围(假设您正在讨论嵌套范围),因此旧值不会被覆盖.通常最好避免阴影.

  3. 通常,在相同的范围内,是的,但更多的是编码风格方面.它不会在执行中产生有效的差异,因为无论var在同一范围内声明相同的次数,只有一个声明.

  4. 要看.你是在谈论在循环中覆盖?如果您不再需要当前值,则不应该是一个问题.


要清楚,当你这样做:

var base = {x:Infinity, y:Infinity};

var base = {x:0, y:0}
Run Code Online (Sandbox Code Playgroud)

真正发生的是这个:

var base;  // declaration is hoisted

base = {x:Infinity, y:Infinity};  // new object is referenced by base

base = {x:0, y:0}  // previous object is released, and new object is referenced
Run Code Online (Sandbox Code Playgroud)

请注意,当我谈论范围时var,我正在具体谈论功能范围.在标准的JavaScript/ECMAScript实现中,没有块作用域,因此varfor语句中使用时没有特殊含义.

正如@Charles Bailey所提到的,Mozilla已经let允许在块中进行作用域,但它需要特定的关键字.该var语句不识别关于变量范围的块.