toate fac aproximativ același lucru, cu câteva diferențe subtile:
există o distincție între numele funcției și variabila funcția este atribuită. Numele funcției nu poate fi schimbat, în timp ce variabila funcția este atribuită poate fi realocată. Numele funcției poate fi utilizat numai în corpul funcției. Încearcă să-l folosească în afara funcției de organism duce la o eroare (sau undefined
dacă funcția nume a fost anterior declarată printr-un var
declarație)., De exemplu:
var y = function x() {};alert(x); // throws an error
numele funcției apare și atunci când funcția este serializată prin metoda toString a Function
.pe de altă parte, variabila căreia i se atribuie funcția este limitată doar de domeniul său de aplicare, care este garantat să includă domeniul în care este declarată funcția.
după cum arată al 4-lea exemplu, numele funcției poate fi diferit de variabila căreia i se atribuie funcția. Ei nu au nici o legătură între ele. O declarație funcție creează, de asemenea, o variabilă cu același nume ca și numele funcției., Astfel, spre deosebire de cele definite prin expresii de funcții, funcții definite de funcția de declarații pot fi accesate prin numele lor în aplicare au fost ele definite în:
O funcție definită de ‘new Function'
nu au un nume de funcție. Cu toate acestea, în motorul JavaScript Spidermonkey, forma serializată a funcției arată ca și cum ar avea numele „anonim”. De exemplu, alert(new Function())
rezultate:
function anonymous() {}
Din funcția de fapt nu are un nume, anonymous
nu este o variabilă care pot fi accesate în funcție., De exemplu, următoarele ar rezulta într-o eroare:
var foo = new Function("alert(anonymous);");foo();
spre Deosebire de funcțiile definite prin expresii de funcții sau de Function
constructor, o funcție definită printr-o funcție de declarație poate fi folosit înainte de declarația funcției în sine. De exemplu:
foo(); // alerts FOO!function foo() { alert('FOO!');}
o funcție definită de o expresie a funcției sau de o declarație de funcție moștenește domeniul de aplicare curent. Adică funcția formează o închidere., Pe de altă parte, o funcție definită de un constructor Function
nu moștenește niciun alt domeniu decât domeniul global (pe care toate funcțiile îl moștenesc).funcțiile definite de expresiile funcțiilor și declarațiile funcțiilor sunt analizate o singură dată, în timp ce cele definite de constructorul Function
nu sunt. Adică, șirul corpului funcției a trecut la Function
constructorul trebuie analizat de fiecare dată când constructorul este apelat., Deși o expresie a funcției creează o închidere de fiecare dată, corpul funcției nu este reparat, deci expresiile funcției sunt încă mai rapide decât „new Function(...)
„. Prin urmare, constructorul Function
ar trebui, în general, evitat ori de câte ori este posibil.
trebuie remarcat, totuși, că expresiile funcțiilor și declarațiile funcțiilor imbricate în funcția generată de parsarea unui șir Function constructor
nu sunt analizate în mod repetat. De exemplu:
o declarație de funcții este foarte ușor (și adesea neintenționat) transformată într-o expresie de funcție., O declarație de funcții încetează să mai fie una atunci când:
- devine parte a unei expresii
- nu mai este un „element sursă” al unei funcții sau al scriptului în sine. Un „element sursă” este o declarație nestemată în script sau într-un corp de funcții: