Alle gjør omtrent det samme, men med noen små forskjeller:
Det er et skille mellom funksjon navn og variable funksjonen som er tilordnet til. Funksjonen kan ikke navnet endres, mens den variable funksjonen som er tilordnet kan tilordnes på nytt. Funksjon navn kan bare brukes i funksjonen ‘ s kropp. Hvis du prøver å bruke det utenfor funksjonen er kroppen fører til en feil (eller undefined
hvis funksjonen navnet ble tidligere erklært via en var
statement)., For eksempel:
var y = function x() {};alert(x); // throws an error
På navnet til funksjonen også vises når funksjonen er serialisert via Function
‘s toString-metode.
På den annen side, den variable funksjonen som er tilordnet er bare begrenset av sitt omfang, som er garantert å inkludere omfang som funksjonen er deklarert.
Som den 4. eksempel viser, funksjon navn kan være forskjellige fra de variable funksjonen som er tilordnet til. De har ingen tilknytning til hverandre. En funksjon erklæringen skaper også en variabel med samme navn som navnet på funksjonen., Dermed, i motsetning til de som er definert av funksjon uttrykk, funksjoner definert av funksjon erklæringer kan nås ved deres navn, i det omfang de ble definert i:
En funksjon som er definert av ‘new Function'
har ikke en funksjon navn. Imidlertid, i SpiderMonkey JavaScript-motor, som føljetong form av funksjonen viser som om det har navnet «anonym». For eksempel, alert(new Function())
utganger:
function anonymous() {}
Siden funksjonen faktisk ikke har et navn, anonymous
er ikke en variabel som kan nås innen funksjonen., For eksempel, følgende vil resultere i en feil:
var foo = new Function("alert(anonymous);");foo();
i Motsetning til funksjonene som er definert av funksjon uttrykk eller av Function
konstruktør, en funksjon som er definert av en funksjon erklæringen kan brukes før funksjonen erklæring i seg selv. For eksempel:
foo(); // alerts FOO!function foo() { alert('FOO!');}
En funksjon som er definert av en funksjon uttrykk eller av en funksjon erklæring arver dagens omfang. Det er funksjonen som danner en avslutning., På den annen side, en funksjon som er definert av en Function
constructor ikke arve noe rom for andre enn den globale omfang (som alle funksjonene arve).
Funksjoner som er definert av funksjon uttrykk og funksjon erklæringer analyseres bare én gang, mens de som er definert av Function
constructor er ikke. Det er funksjonen kroppen string gått til Function
konstruktøren må analyseres hver og hver gang constructor er kalt., Selv om en funksjon uttrykk skaper en avslutning hver gang, funksjon kroppen er ikke reparsed, slik funksjon uttrykk er fortsatt raskere enn «new Function(...)
«. Derfor Function
constructor bør generelt unngås når det er mulig.
Det bør imidlertid bemerkes at funksjonen uttrykk og funksjon erklæringer som er nestet i funksjonen som genereres ved analysering en Function constructor
‘s string ikke lest flere ganger. For eksempel:
En funksjon erklæring er veldig lett (og ofte ubevisst) omgjort til en funksjon uttrykk., En funksjon erklæring opphører å være når det er enten:
- blir en del av et uttrykk
- er ikke lenger en «kilde element» av en funksjon eller selve skriptet. En «kilde element» er en ikke-innkapslede uttalelse i skriptet eller en funksjon kroppen: