Jac*_*nkr 7 javascript memory memory-management
比方说,我开始了var
一个Object
在我的代码
var base = {x:Infinity, y:Infinity};
后来我在同一范围内
var base = {x:0, y:0}
我知道我可以重用现有的变量,但我试图迭代一点.
它释放了对旧值的保留,因此可能会被垃圾收集.我可能会说,因为对象可以被不同的变量引用.
如果它们位于不同的范围内,则内部base
将遮蔽外部范围(假设您正在讨论嵌套范围),因此旧值不会被覆盖.通常最好避免阴影.
通常,在相同的范围内,是的,但更多的是编码风格方面.它不会在执行中产生有效的差异,因为无论var
在同一范围内声明相同的次数,只有一个声明.
要看.你是在谈论在循环中覆盖?如果您不再需要当前值,则不应该是一个问题.
要清楚,当你这样做:
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实现中,没有块作用域,因此var
在for
语句中使用时没有特殊含义.
正如@Charles Bailey所提到的,Mozilla已经let
允许在块中进行作用域,但它需要特定的关键字.该var
语句不识别关于变量范围的块.