Javascript backbone.js如何处理不再使用的模型

Javascript backbone.js如何处理不再使用的模型,javascript,memory-management,memory-leaks,garbage-collection,backbone.js,Javascript,Memory Management,Memory Leaks,Garbage Collection,Backbone.js,最近我深入研究了整个客户端MVC/MVVM设计模式,我特别感兴趣的是backbone.js 我不完全理解的一件事是,当不再真正需要模型时,模型会发生什么 假设我们有一个拥有用户和产品的应用程序。我们有用户模型/视图和产品模型/视图 注意:为了简单起见,我们不是用户。我们可以对用户/产品进行CRUD 当我进入产品页面时,我假设我们加载了模型和与之对应的视图 当我们离开页面进入用户页面时会发生什么。已加载用户模型/视图,但仍会加载产品 我们是否让它们保持加载状态,主干网是否为您处理这些问题,或者您是

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

我不完全理解的一件事是,当不再真正需要模型时,模型会发生什么

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

注意:为了简单起见,我们不是用户。我们可以对用户/产品进行CRUD

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

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


我们是否让它们保持加载状态,主干网是否为您处理这些问题,或者您是否明确需要终止某些对象。

主干网不明确地为您处理清理对象。你和JavaScript运行时各占一半

JavaScript是一种垃圾收集语言,如Java、C#、Ruby等。垃圾收集语言的基本原理是,应用程序仍然引用的对象不会被清理。当应用程序不再引用对象时,计数器将被清除

一般而言,JavaScript: 创建变量时,可以将该变量作用于局部函数,也可以将其作为全局变量

在页面的生命周期内,全局变量永远不会被垃圾收集器清除。只有当您完全离开HTML页面时,才会清理这些页面-导航到其他页面并强制浏览器从服务器加载新页面(执行完整的服务器刷新)或关闭浏览器或浏览器选项卡

当变量超出范围时,即当函数已退出且没有更多引用时,将清除函数范围内的变量。有一些例外情况:返回值和闭包

通过将返回值分配给另一个变量,可以在应用程序中保存返回值。返回值属于相同的一般规则,但变量现在位于不同的函数中。一旦该变量超出范围,就可以对其进行清理

闭包允许父作用域提供子作用域可以访问的值。当清理子体范围时,可以允许清理父对象的closured变量(假定没有其他变量保留它)

具有属性和函数的对象属于相同的规则。一个对象可以通过指定一个属性来引用另一个对象或函数:
myObj.foo=thatObj

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

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

您不能强制垃圾收集,但可以强制变量使用JavaScript中的
delete
关键字取消引用它指向的对象:
delete myVar

骨干 主干是JavaScript,所以它属于相同的规则。在主干网中有一些有趣的闭包和引用用法需要注意,这将帮助您知道何时需要手动清理某些对象

例如:事件。偶数处理程序/回调方法通过在触发事件的对象和处理事件的回调之间具有引用来工作。这是主干应用程序中最容易导致内存泄漏的地方之一,我在这里详细讨论了这一点:


除了了解事件在引用方面的工作方式外,只需遵循JavaScript中管理内存的标准规则,就可以了。一旦删除对该用户对象集合的所有引用,它们将被清除。

请注意,如果您
console.log()
您的模型(至少在Chrome中)将保留在内存中,因为控制台有对它的引用


我为此而生气。如果发现内存泄漏,请尝试清除控制台并再次运行配置文件。如果你和我有同样的问题,它就消失了:)

很好的演示和有趣的阅读。这对我来说真的很清楚。我的最后一个问题有点相关,也许你知道答案。如何知道何时编写会导致内存泄漏的代码。有一些工具可以使用吗。我试图查看浏览器开发人员工具,但没有发现漏洞。现在大多数浏览器的开发工具中都内置了内存分析器,我通常都会使用它。例如,在Chrome中,打开开发工具并单击“配置文件”选项卡。您可以拍摄当前javascript运行时内存的快照,并在其中进行检查。我正要开始使用
主干.EventBinder
,然后感到困惑…myView.EventBinder.unbindAll()和
myView.off()
之间有什么区别?提前感谢您的每一次
接通
电话,您都有一个1:1的
断开
电话。在通话时拨打25次
,您必须拨打25次
关机
通话。或者,您可以拨打一个
取消绑定
呼叫<代码>关闭
无法处理回调的匿名函数。您只能通过事件名称+上下文组合解除匿名回调的绑定,这可能会导致问题。最后,eventbinder使您能够创建偶数的分组