Tenemos esta función anónima en nuestro código, que es parte de los parámetros del objeto Ajax de jQuery y que utiliza algunas variables de la función a la que se llama.Cómo refactorizar esta función anónima de Javascript?
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;
}
}
});
}
He omitido el código adicional, pero ya se ha hecho. El código funciona perfectamente bien, pero filtra 4 Kbs en cada llamada en IE, por lo que quiero refactorizarlo para convertir la función anónima en una función con nombre, como this.onSuccess = function (res) {..}.
El problema es que esta función usa variables de this.invoke (..), así que no puedo simplemente sacarlo de su cuerpo. ¿Cómo puedo refactorizar correctamente este código, para que no use funciones anónimas y variables de función principal?
Actualización. Estoy pensando en crear un objeto separado, inicializándolo con los mismos parámetros y pasar su función onSuccess como parámetro para el objeto Ajax de jQuery. Aunque sospecho que todavía perderá memoria.
Actualización 2. He encontrado algunos enlaces que sugieren que la fuga real podría ser causada por jQuery. Simple jQuery Ajax call leaks memory in Internet Explorer Memory leak involving jQuery Ajax requests
Aun así, era bueno para encontrar una manera de refactorizar esto.
Actualización 3. Voy a esperar una solución más genérica, antes de aceptar una respuesta.
¿Cómo se puede saber que esto se está escapando realmente, en lugar de no recogerse de inmediato? Las filtraciones de IE tienden a estar alrededor de las referencias circulares entre los elementos DOM y los controladores de eventos, ninguno de los cuales está obviamente presente aquí. –
IE también se filtra en los cierres, que es lo que tenemos aquí. He depurado el código anterior y, según mi conocimiento, esta es una de las partes donde se produce la fuga, ya que la devolución de llamada no pierde nada. (Para ser justos, todas las filtraciones de navegador en este código). –