この Javascript の匿名関数をリファクタリングするにはどうすればよいでしょうか?
-
23-09-2019 - |
質問
コードにはこの匿名関数があります。これは 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 によって引き起こされている可能性を示唆するリンクをいくつか見つけました。Internet Explorer での単純な jQuery Ajax 呼び出しによるメモリ リーク jQuery Ajax リクエストに関連するメモリ リーク
それでも、これをリファクタリングする方法を見つけられたのは良かったです。
アップデート3。 回答を受け入れる前に、より一般的な解決策を待ちます。
解決
あなたは成功コールバックにアクセスすることができますAJAXリクエストに余分のparamsを追加することができます
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 - 私はあなたの痛みを感じる - それは、これは本当にうまく織り込まれている。
。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;
}
}
}