[英]How to refactor this Javascript anonymous function?
我們的代碼中有這個匿名函數,它是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(..)中的變量,所以我不能把它帶到它的體外。 如何正確重構此代碼,以便它不使用匿名函數和父函數變量?
更新。 我正在考慮創建一個單獨的對象,使用相同的參數初始化它,並將其onSuccess函數作為jQuery的Ajax對象的參數傳遞。 雖然我懷疑它仍會泄漏內存。
更新2.我發現一些鏈接表明實際的泄漏可能是由jQuery引起的。 簡單的jQuery Ajax調用泄漏Internet Explorer中的 內存泄漏涉及jQuery Ajax請求
找到一種重構方法仍然很好。
更新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定義一個包裝器並讓它返回你想要分配的函數。 然后調用外部函數並將其分配給“success”選項,傳遞它需要的值。 這些值將預先分配給內部函數中的變量。 實際上並不確定這是否會有所幫助 - 你仍然會得到一個匿名函數 - 但值得一試
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;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.