2009-10-27 17 views
6

Tomando el marco jQuery por ejemplo, si ejecuta código como este:¿Las funciones nombradas están infravaloradas en JavaScript?

$(document).ready(function init() { foo.bar(); }); 

El seguimiento de la pila que se obtiene en Firebug se verá así:

init() 
anonymous() 
anonymous([function(), init(), function(), 4 more...], function(), Object name=args) 
anonymous() 
anonymous() 

Como se puede ver, no es muy legible, porque tiene que hacer clic en cada función para averiguar de qué se trata. Las funciones anónimas también aparecerían como (?)() en el generador de perfiles, y pueden conducir al error "cannot access optimized closure". Me parece que estas son buenas razones para evitarlos. Luego está el hecho de que ECMAScript 5 depreciará arguments.callee en su modo estricto, lo que significa que no será posible hacer referencia a funciones anónimas con él, por lo que son un poco menos a prueba de futuro.

Por otro lado, el uso de funciones con nombre puede llevar a la repetición, por ejemplo:

var Foo = { 
    bar: function bar() {} 
} 

function Foo() {} 

Foo.prototype.bar = function bar() {} 

Estoy en lo correcto al pensar que esta repetición se justifica a la luz de la conveniencia de depuración funciones con nombre proporcionan, y que la prevalencia de funciones anónimas en buenos marcos como jQuery es un descuido?

Respuesta

3

Encontré la respuesta a mi pregunta en este very informative article. En primer lugar, resulta que estaba en lo cierto acerca de que las funciones nombradas son más deseables, pero la solución no es tan simple como agregar identificadores a todas las funciones anónimas. La razón principal de esto es que JScript implementa expresiones de funciones de una manera muy discontinua.

En segundo lugar, hay una distinción entre declaraciones de funciones y expresiones. Una función anónima es simplemente una expresión de función con el identificador omitido, y agregar un identificador (nombrarlo) no lo convertiría en una declaración (excepto en JScript, que es la razón por la que está roto). Esto significa que todas las otras respuestas estaban fuera de marca.

+2

Lamentablemente, el enlace a ese artículo ya no funciona. Sin embargo, el mismo artículo se puede encontrar aquí: http://kangax.github.com/nfe/ – Jan

1

Pero para mí las funciones anónimas son más legibles en el código fuente, porque estoy seguro de que solo se usan allí.

3

Acepto que hay ciertas desventajas en el uso de métodos anónimos en JavaScript/EMCAScript. Sin embargo, no pase por alto cómo deberían usarse. Para líneas simples que desea pasar a otra función, a menudo son excelentes.

+1

No es como usar funciones nombradas tiene que agregar más líneas, a menos que esté usando nombres muy, muy largos y que tengan un ajuste de palabras. – slikts

+1

No tiene que ser así, no, pero a veces es muy conveniente. A veces la función realmente NECESITA un nombre. ¿Por qué darle uno? –

0

Las funciones anónimas son muy convenientes. Una mejor solución a este problema, en lugar de nombrar las funciones, sería si Firebug le dijera en qué línea en qué archivo se creó la función anónima.

init() 
anonymous() // application.js, line 54 
anonymous() // foo.js, line 2 

Y el seguimiento de la pila es el único lugar donde las funciones anónimas son un problema imo.

+0

Mencioné otros tres problemas con funciones anónimas, y Firebug informa los números de línea para ellos. – slikts

+0

Toma nota del "imo". –

Cuestiones relacionadas