考虑角JS,其中更新视图相当标准的方法的该实施例中:这个AJAX模式是内存泄漏吗?
$scope.fetchResults = function() {
// Some local variable that will cause creation of closure
var hugeData = serviceX.getMilionRecords();
// Any call to any resource with success and error handlers.
$http({
method: "GET",
url: "/rest-api/bulk-operation-x",
params: { someParam: hugeData.length }
}).success(function() {
var length = hugeData.length;
$scope.reportToUser("Success, that was " + length + " records being processed!";
}).error(function() {
var length = hugeData.length;
$scope.reportToUser("Something went wrong while processing " + length + " records... :-(";
});
};
这是当然假设的例子,但它很好地示出了图案,这可能从内被描述为复用的局部变量的AJAX回调。在这两个处理器(success
和error
)我们正在创造过hugeData
封闭这是直接从回调处理程序中引用
当然。
我的问题是:由于AJAX调用的结果只能是成功或失败,这段代码是否会重复使用导致内存泄漏?我会回答“是”,但我无法在我的本地测试中可靠地证明这一点。
我想要一些更有经验的导师为我解释这一个。我很喜欢每天使用Angular的任何人的回复,但是也欢迎任何jQuery响应。
“内存泄漏”是一个非常具体的术语,指的是分配的内存,随后永远不会释放。它仅适用于手动完成内存管理的上下文。鉴于JS管理对程序员来说是透明的,只有在某些情况下讨论导致错误实现泄漏内存的编码模式时,内存泄漏才是相关的,就像旧版本的IE一样。我不确定这个问题是否有意义。 – Jon
我不同意@ Jon的评论。一个不好的做法可能会导致内存泄漏,比如填充全局范围内的对象等。在这种情况下,它不会,因为一旦回调完成(并且$ http实例被清除,hugeData变量就会被删除up) – rewritten
@Jon,通过透明内存管理,您可以非常容易地创建任何语言的内存泄漏。爪哇,斯卡拉,JavaScript,C#,你的名字。 @rewritten,这正是我所说的。你怎么知道当''success()'完成时'hugeData'会被删除?从语言的角度来看,'error()'中使用的闭包可能会在稍后的某个时间执行。除非Angular在底层做了一些事情(比如在完成时取消其他回调),那么我们可能会在这里发生内存泄漏。 –