Všichni přibližně stejné, s několika jemné rozdíly:
je rozdíl mezi názvem funkce a proměnné je přiřazena funkce. Název funkce nelze změnit, zatímco proměnnou, ke které je funkce přiřazena, lze znovu přiřadit. Název funkce lze použít pouze v těle funkce. Se snaží využít mimo funkci těla vede k chybě (nebo undefined
pokud název funkce byla dříve deklarována pomocí var
prohlášení)., Například:
var y = function x() {};alert(x); // throws an error
název funkce se také zobrazí, když funkce je serializován pomocí Function
‚s toString metody.
na druhé straně je proměnná, které je funkce přiřazena, omezena pouze svým rozsahem, což zaručuje, že zahrnuje rozsah, ve kterém je funkce deklarována.
jak ukazuje 4. příklad, název funkce se může lišit od proměnné, které je funkce přiřazena. Nemají k sobě žádný vztah. Deklarace funkce také vytvoří proměnnou se stejným názvem jako název funkce., Tedy, na rozdíl od těch, které jsou definovány podle své funkce, výrazy, funkce definované funkce prohlášení lze přistupovat pomocí jejich názvu v rámci které byly definovány v:
funkce definována ‚new Function'
nemá název funkce. V Javascriptovém motoru SpiderMonkey se však serializovaná forma funkce zobrazuje, jako by měla název „anonymní“. Například alert(new Function())
výstupy:
function anonymous() {}
Protože tato funkce vlastně nemá jméno, anonymous
je proměnná, která je přístupná v rámci funkce., Například, následující by mělo za následek chybu:
var foo = new Function("alert(anonymous);");foo();
na Rozdíl od funkce definované funkce, výrazy nebo Function
konstruktor, funkce definovaná deklarace funkce může být použita před deklaraci funkce sám. Například:
foo(); // alerts FOO!function foo() { alert('FOO!');}
funkce definována výraz funkce nebo deklaraci funkce zdědí aktuální rozsah. To znamená, že funkce tvoří uzávěr., Na druhé straně funkce definovaná konstruktorem Function
nezdědí žádný jiný rozsah než globální rozsah (který všechny funkce dědí).
funkce definované výrazy funkcí a deklaracemi funkcí jsou analyzovány pouze jednou, zatímco funkce definovanéFunction
Konstruktor nejsou. To znamená, že řetězec těla funkce předaný konstruktoruFunction
musí být analyzován každý a pokaždé, když je Konstruktor volán., Přestože funkční výraz pokaždé vytvoří uzávěr, funkční tělo není reparováno, takže funkční výrazy jsou stále rychlejší než „new Function(...)
„. Proto by se konstruktoruFunction
mělo obecně vyhnout, kdykoli je to možné.
je však třeba poznamenat, že funkční výrazy a deklarace funkcí vnořené do funkce generované analýzou Function constructor
řetězec není analyzován opakovaně. Například:
deklarace funkce se velmi snadno (a často neúmyslně) změní na funkční výraz., Deklarace funkce přestává být jednou, když se buď:
- stane součástí výrazu
- již není „zdrojovým prvkem“ funkce nebo samotného skriptu. „Zdrojový prvek“ je vnořený příkaz ve skriptu nebo funkčním těle: