Funkce

Funkce

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:

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *