Autor Zpráva
fedd
Profil *
pokus


Omlouvám se za první příspěvěk. Můj problém je následující. Mohl by mi někdo srozumitelně vysvětlit (v knížkách jsem to nikde nenašel), jak je možné v JS předávat parametr následujícím způsobem?

Klasický funkční výraz se kterým se běžně setkávám je např.
var add = function (num) {
    return num + 100;
};

alert(add(10));

Jak ale funguje následující kód:?

var add = function (num) {
    return num + 100;
}(10);
alert(add);

Normálně se jedná o funkční výraz s tím rozdílem, že za uzavírající složenou závorku ještě uvedu např. (10). Potom není proměnná add ukazatelem na funkci, ale do proměnné add se uloží výsledek funkce? Funkce se tedy rovnou zavolá a uloží se výsledek funkce?
_es
Profil
fedd:
Vysvetlil si si to správne. Narozdiel od prvého príkladu sa nedá funkcia použiť opakovane, keďže po príkaze k nej nie je žiaden prístup.
fedd
Profil *
_es:
Dobrá, ale nechápu tu syntaxi. Jakto, že to nevyhodí chybu nebo nějakou hlášku? Jak můžu takhle rovnou po definici funkce předat ještě parametr? V materiálech jsem se o něčem takovém nikde nedočetl, ale narazil jsem na to v jednom příkladu.
_es
Profil
fedd:
Jak můžu takhle rovnou po definici funkce předat ještě parametr?
Možno pomôže krátke vysvetlenie Časté potíže, zajímavosti a poučné debaty » Rozdíl mezi voláním funkce a funkcí či v dokumentácii Mozilly https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function.
Prvý výraz sa dá prepísať do
var add = (function (num) {return num + 100;});
V okrúhlych zátvorkách je vytvorená funkcia a priradená (odkaz na ňu) do premennej add.
Druhý výraz zapísaný ako
var add = (function (num) {return num + 100;})(10);
V tomto prípade nie je funkcia (odkaz na ňu) nikam uložená, no je hneď zavolaná operátorom volania funkcie s argumentom 10 ((10)) a návratová hodnota funkcie uložená do premennej add.
Chamurappi
Profil
Reaguji na fedda:
Funkčnímu výrazu se říká funkční výraz právě proto, že může být součástí výrazů. Bez potíží tedy půjde spustit i toto:
var výsledek = (sečíst ? function(a, b) { return a + b } : function(a, b) { return a * b })(3, 4);
… vyjde buď 7, nebo 12, podle toho, jestli je proměnná sečíst pravdivá, nebo nepravdivá.
fedd
Profil *
Díky za pomoc Chamurappi,_es.
Jestli to dobře chápu, tak se v 1. kroku vytvoří odkaz na funkci, který se uloží do porměnné add. V proměnné add je tedy uložená (jen odkaz na ni) funkce (function (num) {return num + 100;}) a hned v zápětí se díky tomu, že na konci je ještě (10), ta daná uložená funkce zavolá (stejně jako by se napsalo add(10) ) a do proměnné add se tedy přepíše ukazatel na funkci výsledkem funkce, což je hodnota 110.

Chamurappi Existuje někde stručný přehled takových zkrácených výrazů (nahrazení řídící struktury if .. else tím co jsi uvedl jako příklad)? Nemůžu to najít.
Trejpa
Profil
fedd:
nahrazení řídící struktury if .. else tím co jsi uvedl jako příklad
Zrovna rozhodovací operátor uvádí Yuhů v základech JavaScriptu.
Radek9
Profil
fedd:
V proměnné add je tedy uložená (jen odkaz na ni) funkce
Ne. Ta funkce se nikam neukládá. Je to prostě výraz, který se hned zavolá. Stejný princip je u jakéhokoli jiného oprátoru. Když napíšu add = 1 + 2, tak se tam prostě rovnou uloží 3. Nikoli nejdříve 1 a potom součet.
fedd
Profil *
Trejpa: A žádný jiný ternální operátor, nebo zkrácený zápis není?
Radek9: Aha jasně už chápu.
Pořád ale nechápu, kde bych se o tom mohl dočíst, nebo zjistit, že to takhle můžu provést? Je to někde v dokumentaci, v návodech, příručkách .. uvedeno? Nikde jsem na nic takového, že u funčkního výrazu můžu funkci ihned zavolat nenarazil. Proto, když jsem na to narazil v kódu, tak mi to nedáv smysl a hlava mi to nebere. Jinak už je mi to jasné a díky všem za rady.
Radek9
Profil
fedd:
A žádný jiný ternální operátor, nebo zkrácený zápis není?
Už chápu, proč tolik lidí používá výraz „ternální operátor“ namísto „ternární“. Yuhů to má blbě. :-)

Zrovna v JS se dá použít i kombinace běžných logických operátorů or (||) a and (&&). Kupříkladu ternární operátor se dá v některých situacích nasimulovat takto: a && b || c. Ale pouze v případě, že b není falsy value. And totiž - např. ve formě a && b - funguje následující způsobem: Pokud a při převod na bool vyjde false, vrátí a. V opačném případě vrátí b. Or ve stejném případě - tedy a || b - funguje následovně: Pokud a při převodu na bool vyjde true, vrátí a. Jinak vrací b. Nepracují tedy pouze s boolovými hodnotami, nýbrž se všemi.

Operátor or se občas používá k vytvoření defaultní hodnoty proměnné. Namátkou mohu uvést příklad s eventem v DOMu, kde se u starých verzí IE získával nikoli jako parametr listeneru, ale z objektu window:
element.onclick = function (e) {
  e = e || window.event;
};

Toto řešení je plně funkční, protože v případě, kdy je funkce zavolána bez parametru, e obsahuje undefined a je proto přetypováno na false.

Pořád ale nechápu, kde bych se o tom mohl dočíst, nebo zjistit, že to takhle můžu provést
Zkus googlit IIFE (Immediately-Invoked Function Expression). To by také v každé slušnější učebnici mělo být. Funguje to, protože v JS je funkce objekt jako cokoli jiného. Stejným způsobem mohu napsat ({ a: "ahoj" })["a"] a dostanu ahoj.
fedd
Profil *
Radek9:
IIFE (Immediately-Invoked Function Expression) - to je ono. Je zajímavé, že jsem na to ještě nikde nenarazil. No člověk se pořád učí. :-)
Díky za pomoc všem.

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:

Prosím používejte diakritiku a interpunkci.

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