题
我们有这个匿名函数在我们的代码,这是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 =函数(RES){..}
的问题是,这个函数使用变量从this.invoke(..),所以不能只把它外面它的身体。如何正确地重构这个代码,因此它的不使用匿名函数与父函数的变量?
<强>更新强>我想创建一个单独的对象,使用相同的参数进行初始化,并通过其的onSuccess用作用于jQuery的Ajax对象的参数。虽然我怀疑它仍然会泄漏内存。
<强>更新2。强>我已经发现了几个链接表明实际泄漏可能的jQuery引起。 简单的jQuery Ajax调用内存泄漏Internet Explorer中 内存泄漏请求
不过这是很好的找到一个方法来重构这个。
<强>更新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;
}
}
其他提示
+1优秀,很好的问题 - 我觉得你的痛苦 - 这是真的很好因素,因为它是
。建议之一(也许这是你的意思你更新)...定义一个包装器的onSuccess并使其返回要分配的功能。然后调用外部函数,并将其分配给“成功”选项,通过它需要的值。这些值将预先分配给内函数的变量。实际上并不知道这是否会帮助 - 你仍然结束了一个匿名函数 - 但值得一试。
this.invoke = function(method, data, callback, error, bare) {
$.ajax({
success: onSuccess(callback, bare);
});
};
var onSuccess = function(callback, bare) {
return function() {
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;
}
}
}
不隶属于 StackOverflow