Onko mitään etua määritellä funktio nimi muodossa "var new_function=function name(){};" JavaScriptissä?


Ajoin ohjelmaa muuttaakseni joitakin osia JavaScript-koodistani, kun se bugasi muuttujan määrittelyssä funktiona näin:

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

Koodi itsessään toimii, mutta mietin vain, onko ok poistaa 'name' kaikista funktioista, jotka löydän näin (koska se ei riko sitä muussa ongelmassa, joka analysoi JavaScriptiäni) vai voiko sillä olla jokin hyöty, jota en näe.

poistetaan "nimi":

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

Huomautus: alkuperäinen tiedosto, jossa se tapahtui ensimmäisen kerran, oli jquery-1.6.4.js tiedostossa:

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

Kiitos etukäteen avusta :)

Vastaus #1

Function Expressionsin name-tunniste on käytettävissä vain funktion sisällä.

JQuery-esimerkissäsi init-tunnistetta ei edes käytetä, joten mielestäni ainoa etu funktion nimeämisessä on vain virheenkorjauksen tarkoitus; debugger pystyy näyttämään sinulle funktion nimen pitkän kutsupinon aikana.

Vertaa :

Vs.

Haittoja on olemassa, pitkäaikainen virhe IE <=8:ssa saa nimettyjen funktioilmausten vuotamaan nimen tunnisteen ympäröivään kontekstiin, lisäksi luoden kaksi funktio-oliota, esimerkiksi:

var foo = function bar() {}; 

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

Välttääkseen tämän bugin sivuvaikutukset, on olemassa useita kiertotapoja, esimerkiksi työskennellä heti kutsutun funktion sisällä, luoda funktion deklarointi kyseisessä laajuudessa ja palauttaa se, esim.:

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

  return init;
})();

Ja muilla vastaavilla tavoilla suosittelisin sinua tarkistamaan seuraavan artikkelin:

  • Nimetyn funktion salat paljastettu