是$ scope。$ on(' $ destroy',...)' s事件处理程序是否被销毁?

时间:2014-12-15 21:08:50

标签: javascript angularjs angularjs-scope destroy

穿过一个非常小的洞穴#34;今天的角度问题我无法找到答案。在$scope文档中,您可以在"$destroy"上注册一个事件处理程序,该事件处理程序在范围销毁之前调用。这样,您可以取消注册事件处理程序,如下所示:

var deregister = $scope.$on('myCustomEvent', function () {
    // do some crazy stuff
});
$scope.$on('$destroy', function () {
    deregister();
});

但是,$scope.$on('$destroy', ...)必须创建自己的处理程序。这是自动销毁,还是你必须做以下的事情来销毁它?

var deregister = $scope.$on('myCustomEvent', function () {
    // do some crazy stuff
});
var deregisterDestroy = $scope.$on('$destroy', function () {
    deregister();
    deregisterDestroy();
});

1 个答案:

答案 0 :(得分:1)

答案实际上是“可能”,取决于你被自动销毁的意思。如果我们查看范围的$destroy方法的源代码,我们可以看到,在整个子范围内向下广播$destroy事件时,实际的$destroy方法永远不会在任何范围内调用但最初的一个。这意味着实际的清理和属性的清除永远不会发生在子范围上。

这不会泄漏内存的原因是因为一旦在作用域上调用了$destroy,它就会与父作用域分离,因此它有资格进行垃圾回收,因为它应该不再有任何GC根路径。同样的逻辑适用于所有子范围,因为它们也没有到GC根目录的路径。

你的例子是安全的;我自己也是这样做的,以便在必要时清理我自己的处理程序,并且不会遇到任何类型的无限循环。