Jos*_*ose 16 javascript memory-leaks
如果我有这样的功能
function do(callback) {
//do stuff
callback();
}
Run Code Online (Sandbox Code Playgroud)
然后我传入一个匿名函数:
do(function() { //do something else });
Run Code Online (Sandbox Code Playgroud)
在页面的生命周期内,是否收集过匿名函数?如果没有,我如何让它可用于GC?
我必须这样做吗?
var h = function() { //do something };
do(h);
delete h;
Run Code Online (Sandbox Code Playgroud)
我甚至不用担心这个吗?我正在构建一个具有较长生命周期的Web应用程序,使得许多ajax调用保持对象一段时间并且实际上并不需要页面刷新来导航.所以我想弄清楚我是否会陷入内存泄漏怪物.
Tgr*_*Tgr 11
对匿名函数的唯一引用是函数参数,并且在函数完成时消失,因此在此之后您的回调将可用于垃圾回收.除非其他东西获得对它的引用,这可以通过闭包轻松实现:
function doo(callback) {
$.get(url, function() {
// callback is visible here!
});
callback();
}
doo(function() { /* do something else */ });
Run Code Online (Sandbox Code Playgroud)
callback(以及通过调用创建的整个范围doo)必须保留在内存中,因为内部函数可以通过闭包引用它; 它只能在内部函数被垃圾收集时被垃圾收集,并且由于该函数是jqXHR对象的属性,因此该对象必须在此之前进行垃圾收集,谁知道何时会发生...
更新您可以通过不在其他函数中定义函数来避免不必要的闭包:
var func = function() {
// callback is not visible here
}
function doo(callback) {
$.get(url, func);
callback();
}
doo(function() { /* do something else */ });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7128 次 |
| 最近记录: |