mindegyik nagyjából ugyanazt teszi, néhány finom különbséggel:
különbség van a függvény neve és a függvényhez rendelt változó között. A függvény neve nem módosítható, míg a függvényhez rendelt változó áthelyezhető. A függvény neve csak a függvény testén belül használható. A függvény testén kívüli használat kísérlete hibát eredményez (vagy undefined
ha a függvény nevét korábban var
utasítás)., Például:
var y = function x() {};alert(x); // throws an error
a függvény neve akkor is megjelenik, ha a függvény a Function
‘s toString metóduson keresztül szerializálódik.
másrészt a függvényhez rendelt változót csak a hatóköre korlátozza, amely garantáltan tartalmazza azt a hatókört, amelyben a függvényt deklarálják.
ahogy a 4. példa mutatja, a függvény neve eltérhet a függvény hozzárendelt változójától. Nincs kapcsolatuk egymással. A függvény deklaráció létrehoz egy változót is, amelynek neve megegyezik a függvény nevével., Így a függvénykifejezések által definiáltakkal ellentétben a függvénynyilatkozatok által definiált függvények név szerint érhetők el a következő hatókörben:
a”new Function'
nem rendelkezik függvénynévvel. A SpiderMonkey JavaScript motorban azonban a funkció sorosított formája úgy tűnik, mintha “névtelen”név lenne. Például:alert(new Function())
kimenetek:
function anonymous() {}
mivel a funkciónak valójában nincs neve,anonymous
nem olyan változó, amely elérhető a függvényen belül., Például, a következő eredményezne hiba:
var foo = new Function("alert(anonymous);");foo();
Ellentétben funkciók által meghatározott funkcióval kifejezések, vagy a Function
kivitelező, a függvény által meghatározott függvény nyilatkozat lehet használni, mielőtt a funkció nyilatkozat is. Például:
foo(); // alerts FOO!function foo() { alert('FOO!');}
egy függvény kifejezés vagy egy függvény deklaráció által definiált függvény örökli az aktuális hatókört. Vagyis a funkció lezárást képez., Másrészt a Function
konstruktor által definiált függvény nem örökli a globális hatókörön kívül más hatókört (amelyet az összes funkció örököl).
a függvénykifejezések és függvénynyilatkozatok által definiált függvényeket csak egyszer értelmezzük, míg a Function
konstruktor által definiált függvényeket nem. Vagyis a Function
konstruktornak átadott függvénytest-karakterláncot minden egyes alkalommal meg kell vizsgálni, amikor a konstruktort hívják., Bár egy függvénykifejezés minden alkalommal bezárást hoz létre, a függvénytestet nem módosítják, így a függvénykifejezések még mindig gyorsabbak, mint a “new Function(...)
“. Ezért aFunction
konstruktort általában kerülni kell, amikor csak lehetséges.
meg kell azonban jegyezni, hogy a Function constructor
‘s karakterlánc elemzésével létrehozott függvény-kifejezések és függvény-deklarációk nem kerülnek többször elemzésre. Például:
egy függvény deklaráció nagyon könnyen (és gyakran véletlenül) függvénykifejezéssé alakítható., A függvény deklaráció megszűnik, ha vagy:
- A
- kifejezés részévé válik, már nem egy függvény vagy maga a szkript” forráseleme”. A “forráselem” egy nem beágyazott utasítás a szkriptben vagy egy függvénytestben: