这是我对 Stackoverflow 的第一个问题,所以我希望我做对了:
我在我的应用程序中广泛使用了 Kendo Widgets。我为每种 Widget 类型(MyAutocomplete、MyGrid 等)使用自定义包装器。每个包装器都将代理函数传递给小部件的构造函数:
var me=this;
$("#mywidget").kendoAutoComplete({
...
dataTextField: me.dataTextField,
select: $.proxy(me.onSelected, me),
change: $.proxy(me.onChanged, me),
});
包装器有一个 dispose 函数,它调用 Kendo 的 'destroy' 方法、Jquery 的 'remove' 和 'off' 方法等。
运行我的应用程序会产生严重的内存泄漏。使用 Chrome 开发工具的配置文件选项卡,我看到保存包装器的上下文是代理引用:
proxyjquery.js:775
function () {
return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
}
我通过删除代理并传递原始事件处理程序来检查这一点。尽管无法正常运行(粗略的),但不再引用包装器。我认为是这样的: .proxy 是原始函数的闭包(例如 me.onSelected ),因此“return fn.apply”持有对“fn”的引用,即“me.onSelected”。
所以问题是:我对关闭问题是否正确,如果是这样 -
如何清除对代理的事件处理程序的引用?
提前谢谢了。