这是我对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 Dev Tools的“配置文件”选项卡,我看到保存包装器的上下文是代理参考:
proxyjquery.js:775
function () {
return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
}
我通过删除代理并传递原始事件处理程序来检查这一点。 虽然无法正常运行(粗略),但不再引用包装器。 我认为是这样的:.proxy是原始函数的闭包(例如me.onSelected), 所以'return fn.apply'保持对'fn'的引用,即'me.onSelected'。
所以问题是:关于封闭问题我是否正确,如果是的话 -
如何清除对代理的事件处理程序的引用?
非常感谢提前。