在动态加载的页面中管理javascript内存使用情况

时间:2017-01-06 16:53:35

标签: javascript ajax

冒着因为模糊或提出意见而被拒绝投票的风险,我不确定如何妥善处理这种情况,或者甚至是否重要。

我正在开发一个单页Web应用程序,其中除主页(带有菜单系统)之外的所有页面都是通过ajax动态加载的。我使用的所有javascript库(jquery,bootstrap,kendo和其他)都加载在主页面以及我的application.js和css文件中。

我加载的每个页面都需要它自己的javascript,并且有一个与html文件相同的相应js文件(为了我自己的理智)。当页面下载并在内容元素中设置时,页面js会运行,这很棒。

我很快意识到页面js正在将它创建的任何变量添加到全局javascript空间。理想情况下,在加载不同的页面时,这些变量会消失,因此javascript垃圾收集最终可以回收该内存。

为方便起见,我开始为通用结构重用相同的名称,例如kendo viewmodels,因此当加载新页面时,它会替换任何同名的全局变量。

在某些特殊变量的情况下,我将其值设置为null以释放全局ajax加载器函数中的内存。

我考虑在执行此操作的所有页面上添加release()函数,并在卸载页面之前调用它。由于发布功能是全局的,每个页面重新定义它在交换页面之前调用它应该有效。

我的问题:

  1. 重要吗?我是否应该关心可能留在身边的几公斤公羊..

  2. 有没有更好的方法来解决这个问题?

  3. 我现在做的甚至有效吗? javascript垃圾收集是否清理了未引用的ram,就像我认为的那样?

  4. 在Giacomo的回答之后

    跟进

    Giacomo您的技术在页面正常运行并且kendo绑定可以访问在Page例程中创建的本地viewmodel变量的意义上工作。我担心的是我不知道它是如何工作的。我省略了var page = Page();赋值并只包含Page();在脚本的末尾(在Page()函数之外)并且似乎没有任何不利影响。

    我看到它的方式是当页面被设置到它的父元素的html(一个div)时运行脚本,这定义然后运行Page()函数,它创建了所有的页面上的局部变量和kendo小部件/绑定,然后它超出了范围。一旦Page()函数完成,它就会结束并且应该没有任何东西,但是我创建的视图模型仍然保留,因为页面和它绑定所有工作,在页面()中定义的单击事件被执行,所以上。那么,什么时候会消失?当我用新页面替换父母的html时,是否会取消分配?我不知道如何......当然,无论kendo正在做什么来保持对viewmodel的引用似乎让它保持活力,我不相信它会在页面消失时释放,这是我的全部意图。 / p>

    可能是page = new Page();对于取消分配过程至关重要......但我不知道如何确定。

    可能的解决方案?

    有人可以评论这个价值:

    //enters here on ajax page load after inserted into DOM
    var pageData = {
        someData: 999,
        someArray: ["one","two"],
        functionOne: function(arg) {
            //stuff
        },
        functionTwo: function(arg) {
            //stuff
        }
    };
    
    //do some work
    pageData.functionOne(pageData.someData);
    pageData.functionTwo("abc");
    
    //called before page is removed from DOM
    function releasePage() {
        pageData = null;
    }
    
    //GC eventually cleans it up
    

1 个答案:

答案 0 :(得分:0)

你可以将每个页面的js代码放在一个闭包中,例如:

function Page() {
  var var1;
  var var2;

  function myFunc() {
    //...
  }
}

然后在"页面切换"

时将其分配给变量

var page = new Page();

每次都可以继续重新分配相同的变量