目前我正在创建一个网络应用程序。用户应该能够全天运行我的应用程序。目前我有一些内存问题。浏览器似乎崩溃的地方。我使用的是这种结构:
function Module() {
var _me = this;
this.init = function(){
_me.setBindings(); // Using reference from Module instead of this
}
// All kind of functions
this.init();
}
我将其更改为this
。
所以更复杂的情况是这样的(这实际上是我的代码 atm 的一部分):
$.modules.dynamic_static_webpage.prototype.addRedirect = function (anum, aeditor) {
$.prompt(
$.utils.getTranslation("Redirect"),
$.utils.getTranslation("Geef de URL op waar naar toe geredirect moet worden"),
$.proxy(function (num, editor, input) {
this.clearRedirect(editor);
var val = input.val();
if (val.indexOf("www") == 0) {
val = "http://" + val;
}
// Timeout needed, because otherwise the clear is not finished
setTimeout($.proxy(function (n, e, v) {
$.HTMLTexteditorField.setIframeSelectionHTML.call(e, "{CMS-REDIRECT" + n + "_" + v + "}");
this.redirectShow(n, v);
}, this, num, editor, val), 200);
}, this, anum, aeditor)
);
};
现在我已经添加了很多$.proxy
。这似乎有点奇怪。
我有很多“在范围内使用范围外的变量”。我将其重写为上面的代码。我看过类似的不同网站,但无法弄清楚:
有人可以解释一下这是否是避免内存泄漏的正确方法吗?或者有更好的解决方案吗?
最佳答案
您的代码中没有任何内容向我表明您将遇到内存泄漏问题。然而,更令人担忧的是,您用来避免内存泄漏的代码风格使得很难判断 future 是否会出现内存问题。您已经发布了几十行代码;以这种风格编写的数千行代码的代码库可能无法正确审核内存泄漏。
您可以使用的一些内存管理技术:
- 如果不再需要使用某个对象,则取消引用它。垃圾收集器将为您清理对象。
- 如果您动态调用
addEventListener
,请始终调用removeEventListener
,除非您将事件绑定(bind)到的 DOM 节点稍后被销毁。 - 如果您从函数内引用一个对象,然后在某个地方引用该函数,您仍然拥有对该对象的引用。避免保留对不再需要的东西的引用。
遵循这三个准则将使您在处理 JavaScript 的职业生涯中取得大部分进展,而不会出现任何与内存相关的问题:)
关于Javascript 内存管理泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22222119/