gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:20:37 25 4
gpt4 key购买 nike

今天遇到了一个非常“深奥”的 Angular 问题,我找不到答案。来自$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();
});

最佳答案

答案实际上是“可能”,具体取决于您所说的自动销毁的含义。如果我们查看 $destroy 的来源作用域的方法,我们可以看到,虽然 $destroy 事件在整个子作用域中向下广播,但实际的 $destroy 方法永远不会在除初始作用域之外的任何作用域上调用。这意味着实际的清理和清空属性永远不会发生在子作用域上。

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

不过你的例子是安全的;我自己以相同的方式执行此操作,以便在必要时清理我自己的处理程序,并且不会遇到任何类型的无限循环。

关于javascript - $scope.$on ('$destroy' , ...) 的事件处理程序是否被销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27493164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com