2012-08-27 14 views
5

Tengo un problema importante con la creación de perfiles en javascript con funciones anónimas, siempre tengo muchas funciones anónimas, la mayoría de ellas son devoluciones de llamadas, y hace que analizar los resultados del generador de perfiles sea muy difícil para mí.Usando funciones nombradas para devoluciones de llamadas

Finalmente decidí usar funciones con nombre de devoluciones de llamada, así:

var f = function(callback) { 
    // Do something ... 
    callback(); 
} 

f(function named_function() { 
    console.log('Sample callback function!'); 
}); 

Quiero saber que voy a tener ningún problema después de hacer este cambio en mis códigos? ¿Y este tipo de definición de función y aprobación reservará el nombre (function_function) en cualquier lugar?

Respuesta

8

El nombre solo estará disponible dentro del alcance de la expresión de función nombrada.

Pero hay un problema en IE 8 y versiones anteriores. Se filtrará al ámbito externo, y en realidad creará un objeto de función diferente, por lo que debe anularlo si eso es un problema.

f(function named_function() { 
    console.log('Sample callback function!'); 
}); 
var named_function = null; 

Consulte este artículo para obtener más información: Named function expressions demystified

de este modo evitará que como este para resolver el problema de IE.

f(function() { 
    return function named_function() { 
     console.log('Sample callback function!'); 
    }; 
}()); 

Pero eso es un poco feo.

0

Si pasa funciones anónimas como esa, el nombre existirá dentro de la función misma.

No existirá en ningún otro ámbito.

var f = function(callback) { 
    // Do something ... 
    callback(); 
} 

f(function named_function() { 
    console.log(named_function); // Logs the function 
    console.log('Sample callback function!'); 
}); 

console.log(named_function);​ // Error: named_function is undefined 
0

La definición de una devolución de llamada con nombre en un ámbito hará que sea visible solo en ese ámbito. Por lo tanto, concluiría que no debería haber ningún conflicto de nombres. Por ejemplo, el siguiente código se ejecuta como se esperaba:

(function named_callback() { console.log("Callback 1"); })(); 
(function named_callback() { console.log("Callback 2"); })();​ 
0

En realidad, todavía está creando una expresión de función anónima y asignándola a una variable de ámbito local f. Ir para

function f(callback) { 
    callback(); 
} 

f(named_function); 

function named_function() { 
    console.log('Sample callback function!'); 
} 

De esta manera, usted está evitando incluso la expresión función llamada fuga de memoria en < = IE8, más puesto que ya no está creando una expresión función, sino una declaración de la función *, se incluso puede acceder al f dentro del cuerpo.

+0

yo no diría que es una función anónima. No crea un símbolo en el alcance actual, pero la función tiene un nombre :) –

1

No tiene que complicar las cosas.

sólo el nombre de la función cuando se declara que

var foo = function foo(){}; 
Cuestiones relacionadas