作为AngularJS的一个相对较新的人,我想了解更多关于AngularJS中的闭包以及如何使用它们以避免泄漏内存。
我是否认为下面的代码会泄漏内存,因为回调函数没有释放对func1,func2和foo的引用?
angular
.module('Mod1').
.controller('Ctrl1', ['$scope', 'foo', 'Service1', function($scope, foo, Service1) {
var func1 = function() {
// do stuff
}
$scope.func2 = function() {
// do more stuff
}
Service1.loadData().then(function(data) {
func1();
$scope.func2();
foo.func3();
});
$scope.$watch('blah', function() {
func1();
$scope.func2();
foo.func3();
});
}]);
或者是否会在范围内自动释放回调,因此删除对func1,func2和foo的最后引用?
答案 0 :(得分:1)
当范围对象无法访问且不再被其他对象或函数引用时,Javascript将清除范围和回调函数。
该算法减少了&#34的定义;不需要对象 再" to"一个物体无法到达"。
该算法假定知道一组称为根的对象 (在JavaScript中,根是全局对象)。定期, 垃圾收集器将从这些根开始,找到所有对象 从这些根引用,然后从中引用所有对象 从根部开始,垃圾收集器就这样了 找到所有可到达的对象并收集所有不可到达的对象。
答案 1 :(得分:0)
function assignHandler(){
var element = document.getElementById( "someElement" );
var id = element.id;
element.onclick = function(){
alert(id);
};
element = null;
}
来自Professional JavaScript for Web Developers by Nicholas Zakas
的示例而且,正如我所看到的,你正在使用AngularJS,所以你应该在这个文件中使用immediate invoked function
(这就是为什么不能从全局范围到达所有这个函数的原因)。这就是为什么,你会在private scope
中调用函数,这将导致清理范围,正如之前的答案中所述。