我们的代码中有这个匿名函数,它是 jQuery 的 Ajax 对象参数的一部分,并且使用调用它的函数中的一些变量。
this.invoke = function(method, data, callback, error, bare) {
$.ajax({
success: function(res) {
if (!callback) return;
var result = "";
if (res != null && res.length != 0)
var result = JSON2.parse(res);
if (bare)
{ callback(result); return; }
for (var property in result) {
callback(result[property]);
break;
}
}
});
}
我省略了额外的代码,但你明白了。该代码工作得很好,但在 IE 中每次调用都会泄漏 4 Kbs,因此我想重构它以将匿名函数转换为命名函数,例如 this.onSuccess = function(res) { .. }。
问题是这个函数使用 this.invoke(..) 中的变量,所以我不能把它放在函数体之外。我如何正确地重构这段代码,以便它does not使用匿名函数和父函数变量?
Update.我正在考虑创建一个单独的对象,使用相同的参数初始化它,并将其 onSuccess 函数作为 jQuery 的 Ajax 对象的参数传递。虽然我怀疑它仍然会泄漏内存。
更新2。我发现一些链接表明实际泄漏可能是由 jQuery 引起的。简单的 jQuery Ajax 调用会泄漏 Internet Explorer 中的内存 https://stackoverflow.com/questions/2429056/simple-jquery-ajax-call-leaks-memory-in-ie
涉及 jQuery Ajax 请求的内存泄漏 https://stackoverflow.com/questions/1455947/memory-leak-involving-jquery-ajax-requests
不过找到一种方法来重构它还是很好的。
更新3。在接受答案之前,我会等待更通用的解决方案。
您可以向 ajax 请求添加额外的参数,这些参数可以在成功回调中访问:
this.invoke = function(method, data, callback, error, bare) {
$.ajax({
success: onSuccess,
invokedata: {
callback: callback,
bare: bare
}
});
};
var onSuccess = function(res) {
var callback = this.invokedata.callback,
bare = this.invokedata.bare;
if (!callback) return;
var result = "";
if (res != null && res.length != 0)
var result = JSON2.parse(res);
if (bare){
callback(result);
return;
}
for (var property in result) {
callback(result[property]);
break;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)