У нас есть эта анонимная функция в нашем коде, который является частью параметров объекта Ajax jQuery и который использует некоторые переменные от функции, от которой это называют.
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;
}
}
});
}
Я опустил дополнительный код, но Вы получаете идею. Превосходные работы кода, но это пропускает 4 КБ на каждом вызове в IE, таким образом, я хочу осуществить рефакторинг его для превращения анонимной функции в именованную, как this.onSuccess = функция (res) {..}.
Проблема состоит в том, что эта функция использует переменные от this.invoke (..), таким образом, я не могу только взять его за пределами его тела. Как я правильно осуществляю рефакторинг этот код, так, чтобы он не использовал анонимные функции и породил функциональные переменные?
Обновление. Я думаю о создании отдельного объекта, инициализируя его с теми же параметрами, и передаю его функцию onSuccess в качестве параметра для объекта Ajax jQuery. Хотя я подозреваю, что это все еще пропустит память.
Обновление 2. Я нашел несколько ссылок, предполагающих, что фактическая утечка могла бы быть вызвана jQuery. Простой Ajax jQuery называет память утечек в Internet Explorer Утечка памяти, включающая запросы Ajax jQuery
Тем не менее было хорошо найти способ осуществить рефакторинг это.
Обновление 3. Я буду ожидать более универсального решения, прежде, чем принять ответ.
Вы можете добавить дополнительные параметры к ajax-запросу, к которым можно получить доступ в обратном вызове success:
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;
}
}
}