AngularJS关闭内存泄漏?

时间:2015-10-14 10:54:07

标签: javascript angularjs memory-leaks

作为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的最后引用?

2 个答案:

答案 0 :(得分:1)

当范围对象无法访问且不再被其他对象或函数引用时,Javascript将清除范围和回调函数。

Mark-and-sweep algorithm

  

该算法减少了&#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中调用函数,这将导致清理范围,正如之前的答案中所述。