【问题标题】:AngularJS closure memory leaks?AngularJS 闭包内存泄漏?
【发布时间】:2016-01-12 10:20:08
【问题描述】:

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

【问题讨论】:

    标签: javascript angularjs memory-leaks


    【解决方案1】:

    当作用域对象无法访问且不再被另一个对象或函数引用时,Javascript 将清理作用域和回调函数。

    Mark-and-sweep algorithm

    该算法减少了“不需要对象”的定义 不再”到“无法访问对象”。

    该算法假定知道一组称为根的对象 (在 JavaScript 中,根是全局对象)。定期地, 垃圾收集器将从这些根开始,找到所有对象 从这些根引用,然后引用的所有对象 这些,等等。从根开始,垃圾收集器将因此 查找所有可达对象并收集所有不可达对象。

    【讨论】:

      【解决方案2】:
      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 中调用函数,这将导致清理范围,正如之前的答案中所说的那样。

      【讨论】:

        猜你喜欢
        • 2016-02-24
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        相关资源
        最近更新 更多