Postoji li ikakva prednost definiranja imena funkcije u "var new_function=function name(){};" u JavaScriptu?


Pokrenuo sam program da bih promijenio neke dijelove svog JavaScript koda kada je došlo do greške u deklaraciji varijable kao funkcije ovako:

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

Sam kod radi, ali samo sam se pitao je li u redu ukloniti 'name' za sve funkcije koje nađem ovako (jer to ne bi trebalo pokvariti u drugom problemu koji analizira moj JavaScript) ili bi to moglo imati neku svrhu koju ne mogu vidjeti.

uklanjanje "imena":

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

Napomena: originalna datoteka u kojoj se to prvi put dogodilo bila je jquery-1.6.4.js u:

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

Hvala unaprijed na bilo kakvoj pomoći :)

Odgovor #1

Identifikator name funkcijskih izraza dostupan je samo unutar same funkcije.

U vašem jQuery primjeru init identifikator se čak ni ne koristi, pa mislim da je jedina prednost davanja imena funkciji samo za potrebe otklanjanja pogrešaka, debugger će moći prikazati ime funkcije u dugom nizu poziva.

Usporedi :

Protiv

Postoje nedostaci, dugogodišnja greška u IE <=8 uzrokuje da imenovane funkcijske izraze propuštaju ime identifikatora u njihov okolni opseg, štoviše, stvarajući dva funkcijska objekta, na primjer:

var foo = function bar() {}; 

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

Kako bi se izbjegli neželjeni učinci ovog buga, postoji nekoliko zaobilaznih rješenja, na primjer, rad unutar odmah pozvane funkcije, kreiranje deklaracije funkcije unutar tog opsega i njezino vraćanje, npr.:

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

  return init;
})();

I na druge slične načine, preporučio bih vam da provjerite sljedeći članak:

  • Nazvana funkcija objašnjena