Autor Zpráva
quatzael
Profil
Zajímalo by mě využití, fungování a smysl funkce, která je obsahem proměnné.
Tady je to co myslím:
var funkce = function(param) {
   // Do something with param
   };

Je to k něčemu užitečné?
Díky za odpovědi.

EDIT: Možná lépe řečeno, k čemu slouží proměnná, která obsahuje funkci?
Alphard
Profil
quatzael:
Je to k něčemu užitečné?
Velmi. Takhle si můžeš nechat funkci vrátit funkcí nebo ji předat jiné funkci. Javascriptová specifika neznám, ale obecně o konceptu viz en.wikipedia.org/wiki/Anonymous_function.
marizikmund
Profil
Pokud to bereš z hlediska vytvoření funkce, máš tři možnosti:

Function declaration:
function myFunction(a, b) {
    return a * b;
}

Function expression:
var x = function (a, b) {return a * b};

Function constructor:
var myFunction = new Function("a", "b", "return a * b");

Poslední možnost asi moc nevyužiješ. U prvních dvou je hlavně rozdíl v tzv. hoistingu a to tak, že function declaration můžeš udělat kdekoliv v souboru (klidně až za tím řádkem, kdy ji voláš), a vše proběhne v pořádku. Ale pokud vytvoříš funkci přes function expression, musíš tak udělat ještě před tím, než ji budeš volat, protože jinak bude znám během jejího volání jen její název, ale ne obsah, více zde.

A k čemu je to dobré? Často se tak vkládají callbacky, neboli funkce, které se vykonají, až původní funkce doběhne. Využívá se toho, že jsou v JavaScriptu funkce tzv. first-class-citizens.
quatzael
Profil
Alphard, marizikmund:
Díky moc za odpovědi.
Radek9
Profil
Ještě bych doplnil, že je to taky kvůli tomu, že všechno v JS je objekt (až na primitivní typy, ale i ty se tak trochu chovají), i funkce. Takže ji můžeš předávat stejně jako cokoli jiného. Podobným způsobem třeba definuješ metody na prototypu nějakého konstruktoru.
Chamurappi
Profil
Reaguji na marizikmunda:
Function constructor
Ten ani nemá cenu zmiňovat, je to jen evalová varianta funkčního výrazu.

Ještě bych zmínil, že to, že je funkce vytvořená normálně deklarací, neznamená, že ji nejde za běhu přepsat funkčním výrazem (nebo nějakou úplně jinou hodnotou). Ten rozdíl v hoistingu je jediný rozdíl, nejen hlavní.
_es
Profil
Chamurappi:
Ten rozdíl v hoistingu je jediný rozdíl, nejen hlavní.
Ešte je rozdiel v tom, že deklarácie funkcií by nemali byť v podmienene spúšťaných blokoch - ak sú, tak sa to v rôznych prehliadačoch môže chovať rôzne: http://zapisnik.pepiino.cz/co-byste-meli-vedet-o-javascriptu-4-deklarace-funkce-a-funkce-jako-vyraz/. Pre príkaz var ten problém nenastáva. Premenná f existuje pred aj po príkaze if(false) var f;, no nemusí existovať pred ani po príkaze if(false) function f(){}; a v tých prehliadačoch, kde existuje, sa to asi tiež nemusí správať rovnako. A funkčne sa líši aj príkaz if(true) function f(){}; z hľadiska existencie a hodnoty f pred a za príkazom.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: