Autor Zpráva
zero0x
Profil
Pozrite si kod:

$(document).ready(function(){
		pridajChovanie("ahoj ty vole");
	});
	
	function pridajChovanie(hlaska){
		var druhaHlaska = "dakujeme za kliknutie..";
		$("a.odkaz").click(function(){
			alert(hlaska);
			alert(druhaHlaska);
			
			setTimeout(function(){ alert(hlaska + " + " + druhaHlaska)}, 1000);
		});		
	}


Testoval som nieco, co dlhu dobu nechapem :) a som si isty, ze taketo nieco (podobne) mi niekedy nefungovalo

ako je mozne ze toto funguje? ved som vlastne definoval novu funkciu, preco ma pristup k premennym??

diki za odpovede a nazory
peta
Profil
zero0x
1. nazev tematu - spatny, tak lze nazvat vsechno tu :)
2. mas tam hned nekolik chyb a kdybys pouzil alert a JS konzolu, zjistil bys kde.
Bezva pridat odkaz na stranku.
a) nikde neni definovane, co je $()
b) nevim, co je v $(), ale document je objekt a pravdepodobne mas definovane $(retezec)
c) definovany setTimeout(retezec,cislo) , ty mas opet neco jineho
d) funkci, kterou pridavas bys mel mit zrejme definovanou pred
e) nemam zkusenosti s akci neco.ready, ale rekl bych, ze to spousta www prohlizecu bude ignorovat

Zaver: Ne, to ti nikdy nemohlo fungovat.
Mike8748
Profil
peta
kdyz nevis co to je, proc to komentujes? proc pises nejaky zavery bez znalosti podstaty, vedouci tedy k chybnym zaverum?
$() je samozdrejme normalni funkce, jinde definovana

zero0x
ten kod bude fungovat bez problemu, pokud pred tim k dokumentu pripojis prototypes.js, pripadne jinou na prototypes zalozenou knihovnu
los
Profil *
To, že tá funkcia má prístup k premenným, je základná vlastnosť v JavaScripte, viď Google: JavaScript closures.
peta
Profil
Mike8748
Nedelej machry a priznej radeji, ze si hrajes take na kristalovou kouli :)
Ja jen povidam, ze bez zbytku kodu lze jen hadat. Coz delas i ty, tak, o co ti go?
Co ty vis, jakym zpusobem ma funkci $() definovanou a jestli je to funkce?
Jak vis, co mu hlasi JS konzola?
Jak vis, ze $() je definovana prave v prototypes.js ?
Ze zrovna jeden script to ma definovane tak, jak jsi to nekde videl, jeste neznamena, ze to nejaky sikovny uzivatel neprepsal podle sebe, k lepsimu ci horsimu.

2c - je mozny, ze to funguje
2e - je mozne, ze document.ready je neco podobne jako onload a ze to nektere prohlizece berou.
Měsíček
Profil
peta: s prvního příspěvku co jsi sem dal to tak vypadalo.
Chamurappi
Profil
Reaguji na petu:
Ze zrovna jeden script to ma definovane tak, jak jsi to nekde videl
Pokud Mike8748 nežil posledních pár let na Marsu, tak zná současné JS frameworky, v nichž je funkce $() přítomná na každém rohu, obvykle jako více či méně chytrý prohledávač DOMu.

jeste neznamena, ze to nejaky sikovny uzivatel neprepsal podle sebe
Kdyby ji měl upravenou a měl s ní problém, tak by se asi neptal, proč mu uvnitř funkce funguje proměnná zvenku.
K tomu, abych našel odpověď (viz los), nepotřebuji vůbec vědět, co $ znamená.

b) nevim, co je v $(), ale document je objekt a pravdepodobne mas definovane $(retezec)
JavaScript je volnotypový jazyk, funkce může argument otestovat a pracovat s ním podle toho, jakého je typu.

c) definovany setTimeout(retezec,cislo) , ty mas opet neco jineho
První argument je buď řetězec, nebo funkce. Takhle to funguje už deset let.

d) funkci, kterou pridavas bys mel mit zrejme definovanou pred
Nemusí.

je mozne, ze document.ready je neco podobne jako onload a ze to nektere prohlizece berou
Ne, document.ready není nic, ale $(document).ready bude patrně metoda ve frameworku, která nastaví spuštění určité akce po načtení dokumentu.
Ale to je jedno. I kdyby to bylo něco úplně jiného, s dotazem to nijak nesouvisí.

Zaver: Ne, to ti nikdy nemohlo fungovat.
Máš menší přehled než tazatel. Přemýšlel jsem, jestli tě mám vyvracet, nebo rovnou smazat.
zero0x
Profil
dakujem pouzivatelovi los za JavaScript closures. Chcem si to nastudovat a ani som nevedel ako sa tomu hovori.

viem ze s tym ma nieco spolocne zapis: (function(){ ... })();

zabudol som napisat, ze ide o framework jQuery, nenapadlo ma, ze nikto nebude chapat co je to za zapis..

kazdopadne funkcie .ready() a .click() to je sprava eventov, a teda danemu elementu, ktory vratila funkcia $() ako pole (jquery nepracuje s ele ale s polami elementov) priradila chovanie definovane funkciou v argumente.

je to podobne ako setTimeout..

taktiez dakujem pocuvatelovi Chamurappi za objasnenie celeho problemu, takze ak nemate nejake info k teme, nepiste tu uz svoje nazory.

este keby ste mi napisali nieco o (function(){ ... })(); tak by som bol rad..

Pytam sa preto, ze tato problematika mi sposobuje problemy uz niekolko mesiacov, ale v praci som to nemal cas riesit a teraz ked pracujem na vlastnom projekte tak sa chcem aj naucit.
ah01
Profil
zero0x
Oni by se měly zmínit asi 2 slovíčka. První už tu zaznělo a jde o closure. Druhé, které bychom měli zmínit je scope. Scope je oblast ve které je nějaká proměnná definovaná a v rámci které platí. V JS máš 2 možnosti, buť definuješ v rámci globální oblasti, nebo v rámci funkce.

Closuer se pak dá vysvětlit tak, že funkce se v JS nespouštějí v rámci scope, ve kterém je voláš, ale v rámci scope, ve kterém byly definovány. Tj. fce v JS si pamatuje scope kde jsi ji definoval a v rámci toho se spustí.

Co se týče zápisu
(function(){
  ...
})();

Ty potřebuješ naspat nějaký kód a potřebuješ k tomu nějaké proměnné. Abys nezaneřádil globální scope potřebuješ nějaký svůj prostor, kam si můžeš „hrát na svém písečku“ a neovlivňoval okolní prostředí. To je tento případ, ty si vytvoříš svojí fci. v rámci které platí vlastní scope a rovnou ji spustíš. Tohle je obzvlášť důležité, pokud píšeš kód, který si budou moci lidé vložit do svých stránek. Ty nemůžeš používat globální proměnné, protože by mohly kolidovat s proměnnými, které už na stránce používá jiný skript. Např. přesně tohle používá blueborďácké počítadlo.
peta
Profil
Chamurappi
jsi me mel smazat, jestli se ti zda upozorneni na chybejici cast scriptu jako bezpredmetne.

Podle mne zatim vsichni jen hadaji, ze tam neco do stranky nedal. Ale jakou ma stranka skutecne podobu, to zatim jej predpokladame a vyvozujeme.
Stale cekam na odkaz na realnou stranku, script, vypis JS konzoly nebo neco, ceho se lze chytit.
zero0x
Profil
napisal som ze ide o jQuery, to samo o sebe vysvetluje mnoho

ale ked tak velmi chces http://data.hmm.sk/test.html

ah01 dakujem za objasnenie, ale asi to pochopim az ked prestudujem nejake materialy
peta
Profil
zero0x
1 FF - nastroje - chybova konzola
2 FF - reload stranky
-> bez chyb
3 FF - kliknu na odkaz
-> funguje

Nevidim zadny problem, ty ano?
Funguje, konzola nic nehlasi...
Chamurappi
Profil
Reaguji na petu:
Nevidim zadny problem, ty ano?
nazev tematu - spatny, tak lze nazvat vsechno tu :)
Přečti si laskavě znovu ten název tématu a možná pochopíš, proč nevidíš žádný problém.

Reaguji na zero0x:
Zkus si udělat pár pokusů na minimálních příkladech. Jeden objekt, jedna metoda, jedna funkce, jedna globální proměnná, jedna lokální proměnná, jedna vlastnost — pak uvidíš, co jak funguje. Popsat to přesně slovy je totiž skoro stejně složité jako to z toho popisu pochopit.
zero0x
Profil
jasne

este by som sa ta chcel opytat, ako mam riesit nieco ako oop.

zatial som robil toto

var trieda = {
prem1,
prem2,
fun1 : function(){},
fun2: function(){}
}

a pristupoval som premenne cez this.prem1 atd.. samozrejme problem bol pri funkciach, ktore sa volali cez eventy, pretoze na this bolo nieco uplne ine (element na ktorom bol event vyvolany)

teraz ma zaujima ako vyuzit tento scoping, ak chcem priradit elementom eventy ale tiez pracovat s nejakymi premennymi (privatnymi?)

teda jednoducho aky je tvoj nazor na OOP

a ako by podla teba mala vyzerat struktura kodu v JS

dakujem :)

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:

0