Vyhledávání na webu

Existuje nějaká výhoda definovat název funkce v "var new_function=function name(){};" v JavaScriptu?


Spouštěl jsem program, který měl měnit některé části mého javascriptového kódu, když se zasekl při deklaraci proměnné jako funkce takto:

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

Samotný kód funguje, ale jen jsem se dival, jestli je v pořádku odstranit „name“ u všech funkcí, které takto najdu (jestli to nezpůsobí problém v jiné aplikaci, která analyzuje můj JavaScript) nebo jestli by to mohlo mít nějaké využití, které nevidím.

odebrání „name“:

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

Poznámka: původní soubor, kde se to poprvé stalo, byl v jquery-1.6.4.js v:

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 );
};

Díky předem za jakoukoliv pomoc :)

Odpověď č. 1

Identifikátor name u Funkčních Výrazů je přístupný pouze uvnitř samotné funkce.

Ve vašem příkladu s jQuery není identifikátor init ani použit, takže si myslím, že jedinou výhodou pojmenování funkce je jen pro účely ladění, debugger vám bude schopen ukázat název funkce v dlouhém seznamu volání.

Porovnat :

proti

Nevýhody existují, dlouhodobá chyba v IE <=8 způsobuje, že pojmenované funkční výrazy unikají identifikátor jména do svého obalujícího prostoru, navíc se vytvářejí dva objektu funkce, například:

var foo = function bar() {}; 

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

Aby se předešlo vedlejším účinkům této chyby, existuje několik obcházecích řešení, například pracovat uvnitř funkce, která je ihned volána, vytvořit v tomto rozsahu deklaraci funkce a vrátit ji, např.:

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

  return init;
})();

A jiné podobné způsoby, doporučil bych vám přečíst si následující článek:

  • Pojmenovaná funkce odtajněna