如何从对象和类中清除 javascript 中浏览器的内存?

Posted

技术标签:

【中文标题】如何从对象和类中清除 javascript 中浏览器的内存?【英文标题】:How to clean memory of browser in javascript from objects and classes? 【发布时间】:2013-04-28 15:43:21 【问题描述】:

我制作了一个包含三个场景的任务游戏。玩家可以从一个场景移动到另一个场景并返回。 (就像一个众所周知的经典任务:Neverhood,Machinarium,猴岛的诅咒) 每个场景都有自己的对象、类和图形元素包。这是一个场景的脚本外观。

<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="js/jquery.gamequery-0.5.0.2.js"></script>

<!-- ////////////////////////////////////////////////
    ///////////                 Charecters            ////////////////////
     /////////////////////////////////////////////////////////////// -->

    <script type="text/javascript" src="js/charecters/player.js" id="player_anime"></script>
    <script type="text/javascript"  src="js/charecters/mama.js" ></script>


    <!-- ////////////////////////////////////////////////
  ///////////                 Scene globals            ////////////////////
   /////////////////////////////////////////////////////////////// -->
    <script type="text/javascript" src="js/scene_globals/scene2/audio.js"></script>
    <script type="text/javascript" src="js/scene_globals/scene2/background.js" ></script>
    <script type="text/javascript" src="js/scene_globals/scene2/scene.js"></script>

    <!-- ////////////////////////////////////////////////
   ///////////                 Game controls            ////////////////////
    /////////////////////////////////////////////////////////////// -->


    <script type="text/javascript" src="js/game_control.js"></script>

我想为每个场景异步加载脚本,以解决内存使用问题。但我意识到,即使我销毁所有脚本并为下一个场景加载其他脚本,对象和图形元素仍然保留在内存中。

这是一般算法:

1) 为第一个场景加载图形和脚本。 2) 用户通过第一个场景 3) 擦除第一个场景的所有对象、脚本和图形 4) 加载第二个场景所需的所有内容

还有另一种方法:我可以将每个场景的所有内容放入 iframe 中,而不是异步解决方案。因此,当 iframe 重新加载到下一个场景时,所有对象和图形都会擦除。但这里还有一个问题——如何从父页面使用 iframe 中的所有对象和图形。 (我有一些互动)

我希望我糟糕的英语足以把问题说清楚。

等待任何建议。

【问题讨论】:

JavaScript 中没有“类”。除了卸载页面之外,您无法删除脚本。 【参考方案1】:

我的目标是采用类似这样的策略:

采用Module Pattern 编写一个静态的、通用的模块,适用于所有场景 对于每个场景,编写一个 javascript 文件,其中包含一个适当构造的模块,该模块包含该场景特定的所有数据/函数。 在通用框架中包含为所需场景加载(使用例如 JSONP)适当模块的方法。

使用模块模式,您通常会确保一个模块不会“覆盖”另一个同名模块。但是,在这种情况下,这正是您想要的。

在加载新模块时,垃圾收集将在删除“覆盖”模块后进行处理。

由于 javascript 的垃圾收集有点懒惰,您可以在加载新场景之前使用 delete 命令强制它。您需要做的唯一规定是确保将模块定义为外部 project 命名空间的属性(这是典型的模块模式)。

正确实现后,您只需在全局命名空间中放置一个一个成员(为每个实用程序/库对象(例如 jQuery)加上一个或多个)。

【讨论】:

delete is nothing to force garbage collection, but an operator for properties!【参考方案2】:

一般来说你不能

但是,您可以使用一些提示和常用技术来触发垃圾回收。

首先是使用delete 运算符,它用于删除对象的属性。它与在 C++ 等语言中使用的 delete 运算符无关,但可以在将来不需要变量的情况下使用。这将删除对该变量的所有引用,但不会直接删除该变量包含的值。意思是:

// creating the property i in the global object
i = 0;

obj = 
  x : 10,
  y : 20
;

delete i;
// deletes the property i from the global object
// At this point, you are giving a hint to the garbage collector that he 
// can now free the memory associated with i because it is no 
// longer referenced.

delete obj.x; // removes the property 'x' of obj
obj.x = 10; // undefined reference to 'x' in obj

接下来的事情可能只是对变量进行智能管理。例如:

var array = [1, 2, 3];
// using array and the values contained by array ...
array = null;
// this will give a hint to the garbage collector that currently, 
// the value pointed by array ( [1,2,3] ) is not referenced to anymore 
// and can be freed.

请注意,您不能在Javascript(如在其他托管语言中)明确为变量或对象释放内存。在绝大多数情况下,垃圾收集器会表现得非常好。

在您的情况下,为什么不使用 延迟资源加载 以便您可以按需加载每个场景所需的代码?这将具有页面加载速度更快的两个优点,并且您将不再担心您的问题。

【讨论】:

-1。要么perfectionkills.com/understanding-delete,要么理解变量和属性的区别。 它仍然声明“delete i; 释放与 i 关联的内存”,如果我不能观看我投票的所有帖子,我很抱歉上(虽然我肯定会尝试) 'delete' 运算符不会释放内存,我没有这么说。相反,我说“删除”将从全局对象中删除属性“i”,从而提示垃圾收集器释放“i”使用的内存。 好的,我现在看到你明确地使用了全局对象。但是通常不应该这样做,并且需要注意不要将var“意外”用于该全局变量。与 array 一样,无效化是迄今为止更好的方法。

以上是关于如何从对象和类中清除 javascript 中浏览器的内存?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JavaScript 从内存中清除对象 [重复]

如何从不同的swift文件访问一个类中的所有对象

如何从联系人和类中获取联系人的电子邮件和电话号码,没有扩展活动和 oncreate() 方法?

对象和类

对象和类

区块链-前端交互第三篇:JS 基础语句和函数对象和类class