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

