Avatar
lcet.m
Člen
Avatar
lcet.m:

Ahojte, na začátek řeknu, že nejsem webař.

Takže mám ke zkušenějším otázečku - proč je obecně vnímáno (jestli vůbec je) použití eval() v JS jako špatný nápad?

Pomiňme prosím otázky bezpečnosti a přehlednosti kódu - potřebuji to použít na velmi specifickou věc, kde toto 100% odpadá.

Zajímá mě spíš, jestli mají současné browsery třeba nějaké známé problémy s výkonem, ke kterým toto vede?

Díky za vaše názory

 
Odpovědět 19.3.2013 19:05
Avatar
Odpovídá na lcet.m
Michael Olšavský:

Hlavní nevýhodou je jak si psal bezpečnost. Jelikož se ale ptáš ohledně výkonu, "evaluovaný" kód je pomalejší, jelikož funkce eval() znovu volá interpret tzn. kód se nedá zkompilovat a nepoužívá ani cache. Tohle jsou moje informace.

 
Nahoru Odpovědět  +1 19.3.2013 19:18
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na lcet.m
Drahomír Hanák:

Obecně používání eval je špatný nápad, ale neplatí to vždy.

Proč je to špatný nápad?

  1. Zvyšuje se bezpečnostní riziko. Při větším kódu si neuhlídáš, co všechno eval spouští.
  2. je to pomalejší (nejde cachovat, spouští se, až když se zpracuje eval)
  3. je mnohem těžší kód debugovat

Kde by se naopak mohla funkce použít?
Když mám nějaký asynchronní loader javascriptu (třeba AJAXem - např. require.js, Google Closure má myslím taky něco apod.)

 
Nahoru Odpovědět 19.3.2013 19:39
Avatar
lcet.m
Člen
Avatar
Odpovídá na Drahomír Hanák
lcet.m:

Díky za odpověď. Jak už jsem říkal, to co jsi uvedl pod body 1 a 3 vynechávám, protože vím přesně, ke které konkrétní věci se bude tahle technika používat. A ano, jde o javaScript dynamicky vytvářený na serveru a asynchronně načítaný klientem.

Btw, jiná možnost spuštění takového kódu asi ani není? Něco jsem zahlédl ohledně dynamicky generovaného tagu <script>, ale to mi přišlo jako moc velký hack, navíc se mi to na IE nějak nepovedlo uvést v život.

 
Nahoru Odpovědět 19.3.2013 23:32
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na lcet.m
Drahomír Hanák:

Takže ty na serveru generuješ nějakým jazykem JavaScript?

Načítání skriptú jde buďto AJAXem (pak je to asynchronní) nebo přidáním tagu script do DOM, jak jsi zmínil. Můžeš používat obě. Záleží na tom, co ti víc vyhovuje.

 
Nahoru Odpovědět 20.3.2013 0:06
Avatar
lcet.m
Člen
Avatar
Odpovídá na Drahomír Hanák
lcet.m:

Aha, teď tomu moc nerozumím. "Načítání skriptú jde buďto AJAXem (pak je to asynchronní)" - to znamená co? Já prostě udělám z browseru HttpRequest na server, přijmu script ve stringu a ten pak pomocí eval spustím. Žiju v tom, že tomu se říká Ajax?

 
Nahoru Odpovědět 20.3.2013 10:31
Avatar
Kit
Redaktor
Avatar
Odpovídá na lcet.m
Kit:

Místo eval() je v případě jQuery vhodnější použít $.getScript() nebo $.parseJSON() podle účelu.

Nahoru Odpovědět 20.3.2013 10:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na lcet.m
Drahomír Hanák:

To co používáš, je AJAX ;) Asynchronní je to proto, že se JS zpracovává vesele dál a tvůj nový javascript, který chceš přes AJAX načíst, se načte, až prohlížeč obdrží odpověď serveru. Na tu odpověď serveru ale javascript nečeká, pouze zaregistruje callback, který se zavolá po přijetí.

 
Nahoru Odpovědět 20.3.2013 13:23
Avatar
lcet.m
Člen
Avatar
Odpovídá na Drahomír Hanák
lcet.m:

Uf, už jsem si chvíli myslel, že to co jsem myslel že je Ajax, je někdo úplně jiný :)

Ok, díky za názory, pokusím se teda vydat tudy, pokud přijdu na nějaký problém, podělím se...

 
Nahoru Odpovědět 20.3.2013 16:52
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.