在事件调用中访问函数内部作用域之外的对象,以及何时清除对象

时间:2016-01-05 12:59:52

标签: javascript angularjs memory-leaks typescript

我正在尝试创建一个实用程序方法,该方法将附加到AngularJS的$destroy的{​​{1}}事件,以便它自动清理处理程序并避免内存泄漏。下面是一个名为$scope$的实用程序方法的示例代码,它在TypeScript中,但应该与JavaScript非常相似。

attachEventToRootscopeAndRegisterUnbind()

我的问题是:

  1. class EventToUnRegister { public $scope: ng.IScope; public unbindHandler: Function; public eventName: string; public logger: Core.ILog; public onScopeDestroy() { this.logger.debug("EventToUnRegister:onScopeDestroy",`Scope destroyed, unbinding event '${this.eventName}'`); this.unbindHandler(); //remove references this.logger = null; this.unbindHandler = null; this.$scope = null; this.eventName = null; } } attachEventToRootscopeAndRegisterUnbind($scope: ng.IScope, eventName: string, listener: (event: angular.IAngularEvent, ...args: any[]) => any) { var eventToUnRegister = new EventToUnRegister(); eventToUnRegister.$scope = $scope; eventToUnRegister.logger = this.logger; eventToUnRegister.unbindHandler = this.$rootScope.$on(eventName, listener); eventToUnRegister.eventName = eventName; $scope.$on("$destroy", () => { eventToUnRegister.onScopeDestroy(); //<-- IS IT AN ISSUE TO ACCESS THIS HERE? eventToUnRegister = null; //remove reference to make sure it is cleaned up }); } 事件处理程序访问eventToUnRegister是否存在任何问题?
  2. 这种方式是否会出现任何形式的内存泄漏?
  3. 最初的问题是,您出于任何原因附加到$scope.$on上的事件的控制器。理想情况下,这没有完成,但有时需要它。然后,由于$rootscope永远不会被销毁,控制器将因事件而永远存在。我正在尝试创建此实用程序方法来解决此问题。

1 个答案:

答案 0 :(得分:1)

对我来说看起来非常有效,只要在$destroy内没有发现相关事件链,我就不会发现任何问题。除此之外,您并不需要来明确地取消所有内容。如果对包含对象的引用超出范围(并且它的子属性都没有以某种方式返回引用),则该对象被垃圾回收。