backbone.js对不再使用的模型做了什么

Sai*_*han 20 javascript garbage-collection memory-leaks memory-management backbone.js

最近我潜入了整个客户端MVC/MVVM设计模式,我特别感兴趣的是backbone.js.

我不完全理解的一件事是当模型不再需要它们时会发生什么.

假设我们有一个拥有用户和产品的应用.我们有用户模型/视图和产品模型/视图

注意:为简单起见,我们不是用户.我们可以只是CRUD用户/产品.

当我进入产品页面时,我假设我们加载模型和对应的视图.

当我们离开页面并进入用户页面时会发生什么.加载了用户模型/视图,但仍然加载了产品.

我们是否保持它们的负载,骨干是否为您处理,或者您是否明确需要结束某些对象.

Der*_*ley 26

Backbone没有明确处理为您清理对象.这是你和JavaScript运行时的50/50.

JavaScript是一种垃圾收集语言,如Java,C#,Ruby等.垃圾收集语言的基本原则是不会清除应用程序仍引用的对象.与此相反的是,当您的应用程序不再引用对象时,将清除该对象.

JavaScript一般:

创建变量时,可以将该变量范围限定为局部函数或全局变量.

在页面的生命周期中,垃圾收集器永远不会清除全局变量.清理它们的唯一时间是完全退出HTML页面 - 导航到其他页面并强制浏览器从服务器加载新页面(执行完整的服务器刷新)或关闭浏览器或浏览器选项卡.

当变量超出范围时(即函数退出并且不再有对它的引用时),将清除函数范围变量.这有一些例外:返回值和闭包.

通过将返回值分配给另一个变量,可以在应用中保留返回值.返回值属于相同的一般规则,但变量现在处于不同的函数中.一旦该变量超出范围,就可以清除它.

闭包允许父作用域提供后代作用域可以访问的值.当清除后代范围时,可以允许清除父级的关闭变量(假设没有其他东西保留它).

具有属性和功能的对象属于相同的规则.对象可以通过为其分配属性来引用另一个对象或函数:myObj.foo = thatObj.

DOM(文档对象模型 - 应用程序中的HTML)是一个JavaScript对象.对DOM的事件和其他引用与任何其他引用的工作方式相同.如果您有一个处理DOM事件的对象,它在您的应用程序中有一个引用,它将不会被垃圾收集器清理.如果要清理它,则必须删除对它的所有引用 - 包括事件处理程序中的DOM引用.

清理记忆

一般规则是,如果要将数据加载到主干集合或对象中,并且希望清除该对象以使其不再使用内存,则必须删除对该对象的所有引用.这只是标准的JavaScript垃圾收集规则.

您不能强制进行垃圾收集,但是您可以使用deleteJavaScript中的关键字强制变量取消引用它指向的内容:delete myVar

骨干

Backbone是JavaScript,所以它遵循相同的规则.您需要注意Backbone中的闭包和引用的一些有趣用法,这将帮助您了解何时需要手动清理某些对象.

例如:事件.偶数处理程序/回调方法的工作原理是在触发事件的对象和处理事件的回调之间建立引用.这是在Backbone应用程序中导致内存泄漏的最容易的地方之一,我在这里详细讨论它:http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-在骨干,应用/

除了了解事件如何在引用方面工作之外,只需遵循JavaScript中管理内存的标准规则,您就可以了.删除对该User对象集合的所有引用后,它们将被清除.