Búsqueda de sitios web

¿Hay alguna ventaja en definir el nombre de la función en "var new_function=function name(){};" en JavaScript?


Estaba ejecutando un programa para cambiar algunas partes de mi código de JavaScript cuando dio un error en la declaración de una variable como función así:

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

El código en sí funciona, pero solo me preguntaba si está bien eliminar el "name" de todas las funciones que encuentre así (ya que no lo rompe en el otro problema que analiza mi JavaScript) o si podría tener algún uso que no pueda ver.

eliminando el "nombre":

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

Nota: el archivo original donde ocurrió por primera vez 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 );
};

Gracias por cualquier ayuda por adelantado :)

Respuesta #1

El identificador name de las Expresiones de Función, es accesible solo dentro de la propia función.

En tu ejemplo de jQuery, el identificador init ni siquiera se usa, así que creo que la única ventaja de nombrar la función es solo con fines de depuración, un depurador podrá mostrarte el nombre de la función en una larga pila de llamadas.

Comparar :

Vs.

Existen desventajas, un error antiguo en IE <=8 hace que las expresiones de función nombradas filtren el identificador del nombre a su ámbito encerrante; además, crean 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, trabajar dentro de una función llamada inmediatamente, crear una declaración de función dentro de ese ámbito y devolverla, por ejemplo:

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

  return init;
})();

Y otras formas similares, te recomendaría que consultes el siguiente artículo:

  • Función Nombrada Desmitificada