冒着因为模糊或提出意见而被拒绝投票的风险,我不确定如何妥善处理这种情况,或者甚至是否重要。
我正在开发一个单页Web应用程序,其中除主页(带有菜单系统)之外的所有页面都是通过ajax动态加载的。我使用的所有javascript库(jquery,bootstrap,kendo和其他)都加载在主页面以及我的application.js和css文件中。
我加载的每个页面都需要它自己的javascript,并且有一个与html文件相同的相应js文件(为了我自己的理智)。当页面下载并在内容元素中设置时,页面js会运行,这很棒。
我很快意识到页面js正在将它创建的任何变量添加到全局javascript空间。理想情况下,在加载不同的页面时,这些变量会消失,因此javascript垃圾收集最终可以回收该内存。
为方便起见,我开始为通用结构重用相同的名称,例如kendo viewmodels,因此当加载新页面时,它会替换任何同名的全局变量。
在某些特殊变量的情况下,我将其值设置为null以释放全局ajax加载器函数中的内存。
我考虑在执行此操作的所有页面上添加release()函数,并在卸载页面之前调用它。由于发布功能是全局的,每个页面重新定义它在交换页面之前调用它应该有效。
我的问题:
重要吗?我是否应该关心可能留在身边的几公斤公羊..
有没有更好的方法来解决这个问题?
我现在做的甚至有效吗? javascript垃圾收集是否清理了未引用的ram,就像我认为的那样?
跟进:
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
答案 0 :(得分:0)
你可以将每个页面的js代码放在一个闭包中,例如:
function Page() {
var var1;
var var2;
function myFunc() {
//...
}
}
然后在"页面切换"
时将其分配给变量 var page = new Page();
每次都可以继续重新分配相同的变量