javascript中更糟糕的是:垃圾太多,全局变量太多?

javascript中更糟糕的是:垃圾太多,全局变量太多?,javascript,garbage-collection,Javascript,Garbage Collection,我正在努力使我的javascript游戏尽可能轻巧流畅,我的困境是:更糟糕的是,太多的垃圾还是太多的全局变量 一方面,为了避免垃圾收集导致的微暂停,我应该避免在函数和for循环中使用临时变量,这些变量是我用“var”创建的,在函数结束时消失,因为它们变成了垃圾。 但另一方面,如果我用尽可能多的持久性全局变量替换所有这些临时变量,那么为浏览器的javascript引擎运行的程序不会变得更重吗? 更糟糕的是什么 (仅从易于编写和避免错误的角度来看,我永远不会摆脱临时变量。例如,如果函数a调用函数B,

我正在努力使我的javascript游戏尽可能轻巧流畅,我的困境是:更糟糕的是,太多的垃圾还是太多的全局变量

一方面,为了避免垃圾收集导致的微暂停,我应该避免在函数和for循环中使用临时变量,这些变量是我用“var”创建的,在函数结束时消失,因为它们变成了垃圾。
但另一方面,如果我用尽可能多的持久性全局变量替换所有这些临时变量,那么为浏览器的javascript引擎运行的程序不会变得更重吗?
更糟糕的是什么


(仅从易于编写和避免错误的角度来看,我永远不会摆脱临时变量。例如,如果函数a调用函数B,并且两者都有一个For(I=…)而不是For(var I=…),那么函数B的For循环将意外地与函数a的“I”发生冲突因为它将是同一个全局变量,而不是属于每个函数的两个不同的临时变量,并且会有bug。避免全局变量出现这种情况的唯一方法是使用更长更显式的名称,这在你必须大量编写它们时很烦人。但是垃圾收集微暂停在游戏中很烦人,所以我必须oid临时变量。多么进退两难。)

Javascript具有自动垃圾收集功能。虽然您不想被一次性变量冲昏头脑,但使用函数来正确定义变量的范围并管理应用程序将使这在几乎所有情况下都不会成为问题

您应该对所有迭代循环使用
for(var i…)
,因为正如您所说,其他选项要么是1)愚蠢的长变量名,要么是2)名称空间冲突

通常,您应该使用函数来命名和模块化游戏/应用程序的组件。为了避免任何实名空间冲突,您可以将整个应用程序包装在一个函数中,以创建私有名称空间,如:

(function(){

   //code goes here

})();
我建议你阅读和阅读


这也是一篇关于Javascript中垃圾收集的优秀文章。

请尝试限制这两个方面。变量的危害比在循环中始终调用长度要小。因此
var max=a.length;for(var i=0;i
比for(var i=0;i快。你误解了垃圾收集。那可能没用。(除非你正在储存和丢弃大量的物品,在这种情况下仍然没有帮助)首先你必须制定出你的标准来决定一种策略而不是另一种策略,否则你的困境将永无止境。就绩效而言,局部变量和全局变量之间的差异可能微不足道。如果您想要模块化的、可维护的代码,那么本地变量是首选。每次调用函数时,都会创建一个新的执行上下文。每次函数结束时,该执行上下文都可用于垃圾收集(除非它作为闭包的结果而持续存在)。
我用“var”创建并在函数结束时死亡的那些,因为它们变成了垃圾
,这是不正确的;GC是关于对象的,而不是关于变量的。如果他们不拿东西,他们就不会碰GC;如果是这样的话,您需要关注对象的生命周期。(再坚持下去也帮不了你)谢谢大家的纠正。似乎我被一些网站上的错误信息误导了,他们说所有变量都可能会进入垃圾收集器,甚至函数参数,甚至是我们使用.substring()或串联时秘密创建的变量。但是分配给这些变量的内存会发生什么变化呢?只有当页面关闭时才释放它吗?包含原语的局部变量根本不涉及GC。感谢提示和链接,我正在阅读,我将学到有用的东西。