2011-10-07 5 views
5

yo estaba corriendo un programa para cambiar algunas partes de mi código javascript cuando se molestaba en la declaración de un var como una función como esta:¿Hay alguna ventaja para definir el nombre de la función en "var new_function = function name() {};" en javascript?

var some_function = function name(args){ 
//do stuff 
}; 

El código en sí funciona, pero me estaba preguntando si está bien para eliminar el "nombre" de todas las funciones que encuentro así (porque no lo rompe en el otro problema que analiza mi javascript) o si podría servir para algo que no puedo ver.

eliminar el "nombre":

var new_function = function(){/*do stuff*/}; 

Nota: el archivo original en el que primero ocurra lo fue en jquery-1.6.4.js en:

jQuerySub.fn.init = function init(selector, context) { 
    if (context && context instanceof jQuery && !(context instanceof jQuerySub)) { 
     context = jQuerySub(context); 
    } 

    return jQuery.fn.init.call(this, selector, context, rootjQuerySub); 
}; 

ty para cualquier ayuda de antemano :)

Respuesta

6

El identificador name de Expresiones de función solo es accesible dentro de la función.

En su ejemplo jQuery el identificador init ni siquiera se utiliza, así que creo que la única ventaja para nombrar la función es sólo para fines de depuración, un depurador será capaz de mostrar el nombre de función en una larga pila de llamadas .

Compare:

anonymous functions on stack

vs. existen

named functions on stack

Desventajas, un error de larga data sobre IE < = 8 hace que las expresiones función llamada a gotear el identificador de nombre a su encierra alcance, por otra parte, la creación de dos objetos de función, por ejemplo:

var foo = function bar() {}; 

typeof bar; // "function" on IE 
foo === bar; // false, two different objects 

para evitar los efectos secundarios de este error hay varias soluciones, por ejemplo, para trabajar dentro de una función llamada de inmediato, para crear una declaración de función dentro de ese ámbito, y devolverlo, por ejemplo:

jQuerySub.fn.init = (function() { 
    function init(selector, context) { 
    //... 
    } 

    return init; 
})(); 

y otras formas similares, recomiendo que consulte el siguiente artículo:

+0

Una desventaja es que las expresiones de función nombrados crearán dos funciones en el IE que yo sepa (o algo por el estilo) –

+1

@FelixKling, agregó una nota sobre NFE. – CMS

+0

Ty por su respuesta. También probé en Firefox 7.0.1 y reconoce el nombre dentro de la función, pero no está fuera de si. – Seeker

Cuestiones relacionadas