Autor Zpráva
matesek
Profil
Potřebuji poradit, kde dělám chybu :

<button onclick="znovu()">Start</button>
<button onclick="pocitani()">Započti kliknutí</button>

<script>

function znovu()
{
x=0;
};

function pocitani() 
{
x=x+1;
return x;
};

y=pocitani();

text="y=" + y;

document.write(text);

document.write("Ahoj");

</script>


Na stránce se mi zobrazí pouze tlačítka.
Mělo by to započítávat počet stisknutí tlačítka.
matesek
Profil
Mohl by někdo říct v čem je problém, nebo zda-li je tam někde problém ?
Majkl578
Profil
Před interpunkcí se nepíše mezera.

Pro debugování javascriptu doporučuji Firebug.
x is not defined
[Break on this error] x=x+1;

řádek 13
matesek
Profil
Ale já tam nemůžu dát žádnou konkrétní hodnotu, když chci, aby se pořád přičítala.

Majkl578:
Pro debugování javascriptu doporučuji Firebug.

FireFox nepoužívám, mám pouze Operu.
tommass
Profil *
Proč by si nemohl ? Dej ji uplně na začátek pod <script>
var  x=0;

například ;-) . To se provede jen po spuštění stránky a ne po provedení funkce.
matesek
Profil
ok zkusim a ozvu se
Bubák
Profil
Řádek 21 je hloupost, totéž řádek 23, použij innerHTML.
Witiko
Profil
document.write způsobí otevření nového dokumentu pokud byla DOM struktura aktuálního dokumentu již načtena a document.closed obsahuje true. Otevření nového dokumentu má za následek ztrátu jakéhokoliv spojení s původními scripty a dokumentem. Pro vypisování textu doporučuji nějaké takovéto řešení:

<span id="text"></span>

...

document.getElementById("text").innerHTML = text;


Nyní ty proměnné, tento způsob definice:

x = 0;


není definice proměnné, ale vlastnosti objektu window a je totožný s tímto zápisem:

window.x = 0;


Ačkoliv se poté x jako globální proměnná chová, nejde o způsob definice proměnných. Proměnná se definuje pomocí klíčového slova var, pokud definujeme proměnnou pomocí var uvnitř funkce, je jedinečná pro danou funkci a zaniká po jejím ukončení a ztrátě veškerých spojení jako jsou anonymní funkce, kterým je také přístupná. Pakliže definujeme proměnnou pomocí klíčového slova var mimo funkci, jde o proměnnou globální.

var x = 0;


Poté co takto proměnnou definujeme, odkazuje již x ne na window.x, ale na danou proměnnou.

var x = 0;

function test() {
  var x = 2;
  return x;
}

alert(test());
alert(x);


Tyto dvě proměnné x se navzájem neovlivňují, jedna je globální, druhá je lokální, lokální proměnná je vždy výš než proměnná globální, stejně tak argument funkce. První alert vyhodí 2, druhý 0. Toto by fungovalo podobně:

var x = 0;

function test(x) {
  return x;
}

alert(test(2));
alert(x);


Špatná definice globální proměnné, která ve skutečnosti ani proměnnou není:

function funkce() {
  x = 0;
}


Správná definice a změna globální proměnné:

var x = 0;

function funkce() {
  x++;
}

funkce();
alert(x);
// navrátí 1


Doufám, že jsem alespoň trochu osvětlil základní principy.
matesek
Profil
Děkuji za pokus vysvětlení, ale rozdíl mezi Globální a Lokální pořád nevidím, je tady na mě moc "odborných" výrazů.

Nyní mám tohle :

<button onclick="znovu()">Start</button>
<button onclick="pocitani()">Započti kliknutí</button>

<script>

var x = 0;

function znovu()
{
var x = 0;
};

function pocitani() 
{
x++;
alert (x);
};


</script>


Funguje, ale místo alert() bych chtěl něco, co by zobrazovalo v textu míso v okně. Takhle se to musí před dalším kliknutím potvrdit.
Witiko
Profil
matesek:
Funguje

Nemyslím, místo:

var x = 0;

function znovu()
{
var x = 0;
};


Zkus:

var x = 0;

function znovu()
{
x = 0;
};


Původní funkce ti nenulovala globální proměnnou x, pouze definovala novou proměnnou lokální x, která zmizela ihned po dokončení funkce. Ty nechceš proměnnou definovat, pouze vynulovat její hodnotu.

místo alert() bych chtěl něco, co by zobrazovalo v textu míso v okně.

Už jsem ti to psal, vytvoř si span, div, cokoliv chceš s určitým ID a pak do něj vpisuj:

<span id="text"></span>

...

document.getElementById("text").innerHTML = text;


rozdíl mezi Globální a Lokální pořád nevidím

Pokusím se vysvětlit. Globální proměnná je přístupná z celého scriptu, ze všech funkcí. Toto je příklad globální proměnné:

var a = "Toto je globální proměnná. Mohu k ní přistupovat odkudkoliv.";

function funkce() {
  alert(a);
}

funkce();


Lokální proměnnou definujeme například uvnitř funkce, není přístupná zvenčí, může mít stejný název jako proměnná globální, neovlivní ji. Zaniká po ukončení funkce.

var a = "Toto je globální proměnná. Mohu k ní přistupovat odkudkoliv.";

function funkce() {
  var a = "Toto je lokální proměnná. Má stejný název jako globální proměnná a, ale nemá na globální proměnnou vliv a zanikne po ukončení funkce."
  alert(a);
}

funkce();
alert(a);
matesek
Profil
Witiko:
Vážně díky za ochotu, ale proměnným v JS moc nerozumím a tvým popisům taky moc ne.

A vážně mi to funguje viz
Jestli tam to var je nebo ne, má to stejný účinek ...
Witiko
Profil
matesek:
Jestli tam to var je nebo ne, má to stejný účinek ...

Nemá, všimni si, že při zavolání funkce znovu() / kliknutí na tlačítko Start nedojde k vynulování globální proměnné x, čísla se načítají pořád dál.

Vážně díky za ochotu, ale proměnným v JS moc nerozumím a tvým popisům taky moc ne.

To je mi líto, snažil jsem se to vysvětlit co nejvíc lajcky a jednoduše.


Vysvětlení výrazů:

Proměnná: Znáš z matematiky, jde o útvar v němž je uložena hodnota, která se mění. V javascriptu se definuje pomocí klíčového slova var od latinského variabilitas (proměnný, nestálý). Bez proměnných by nešly psát téměř žádné scripty, až na ty, které používají pouze konstanty.

Konstanta: Opět znáš z matematiky, jde prakticky o proměnnou, až na to, že její hodnota je pevně daná a neměnná. V javascriptu se definuje pomocí klíčového slova const (Internet Explorer nepodporuje) od latinského constantia (stálost, neměnnost). Dobrým příkladem konstanty je například číslo pí.

Globální: Od latinského globulus (kulovitý, po celém povrchu zeměkoule, celosvětový, všeobecný), v tomhle kontextu znamená dostupné všude.

Lokální: Od latinského localis (místní) v tomhle kontextu znamená dostupné jen v jednom místě, v našem případě ve funkci.

Definice: Samotné vytvoření, od latinského definitio (definice, vymezení, určení, stanovení) v našem případě proměnné. Používá se k němu klíčové slovo var a ze své logiky se používá jen jednou, jakmile je proměnná definovaná / vytvořená, není žádný důvod ji "tvořit" znovu.


Globální a lokální proměnné zcela laicky:

Globální proměnnou definuješ mimo funkce, díky čemuž k ní můžeš přistupovat globálně - odkudkoliv.
var x = "globální proměnná";


Lokální proměnnou definuješ uvnitř funkce, díky čemuž existuje pouze uvnitř funkce a jakmile se funkce provede, tak mizí.
function() {
  var x = "lokální proměnná";
}


Pokud někdo ví jak to vysvětlit ještě jednoduššeji, prosím o pomoc. :)
matesek
Profil
Dobrá, tak teš jsi mi vysvětlil pojmy.
Vím že :
var x =1
zadá hodnotu 1 proměnné x
x = 1
udělá to samé, ale nechápu tedy, proč to nesmí být ...

function() {var x=1;}
zadá hodnotu 1 pro proměnnou x, která po ukončení funkce zmizí.

Takže pokud jsem dobře pochopil, tak aby to bylo zadávání proměnné, tak se musí zadat "var x". např "var x=y+z;".
Je to prostě upozornění, že se jedná o proměnnou.
Witiko
Profil
Správně.

var x = 1


Vytvoří proměnnou x s hodnotou jedna.

x = 1


Změní hodnotu již vytvořené proměnné na 1.

A teď proč se takto proměnné nedefinují:

Možná už sis všimnul, že ačkoliv jsou veškeré vestavěné funkce, vlastnosti a objekty podřazené objektu window, nevyžaduje javascript uvádění ho před názvem vlastnosti. Proto místo window.alert můžeš použít alert, místo window.document.write lze použít document.write apod. A zde je jádro pudla. Pakliže definuješ / vytvoříš proměnnou takto:

x = 1


javascriptový interpret si prohlédne seznam proměnných. Protože žádnou proměnnou s názvem x nenajde, bude se chovat podle pravidla, které jsem uvedl nahoře a přeloží si zadání takto:

window.x = 1


Místo proměnné jsme vytvořili vlastnost objektu window. Tato vlastnost window.x se poté chová jako globální proměnná. Nicméně nejde o definici proměnné, ale o silně nevalidní zápis.

Vysvětlení výrazů:

Vlastnost: Proměnná, která je pevně vázána na objekt. Zapisuje se takto: objekt.proměnná, nebo objekt[název proměnné]. Například window.status, document.title apod.
ah01
Profil
matesek:
Pokud chceš definovat globální proměnnou (~ existující mimo funkci), je úplně jedno jestli použiješ var nebo ne. Ale bývá dobrý zvykem var používat, jak jsi správně poznamenal: „Je to prostě upozornění, že se jedná o proměnnou.

Pokud chceš definovat lokální proměnnou (~ existující pouze uvnitř funkce), musíš var použít. Je to jediný způsob jak říct, „bacha, tahle proměnná má existovat jen uvnitř této funkce, jinde ji nechci“.


Witiko:
Asi to myslíš dobře, ale to co píšeš má jisté faktické mezery.

ad „Místo proměnné jsme vytvořili vlastnost objektu window.“:
Co myslíš, že udělá toto?
var x = 1;
alert(window.x);

ad konstanty:
JS obecně konstanty nemá! IE s tím nemá nic společného, nejsou už ve specifikaci. Podporují je jen některé implementace, takže je nemůžeš napříč prohlížeči používat.

ad „... existuje pouze uvnitř funkce a jakmile se funkce provede, tak mizí
To není tak úplně pravda, ale pro tento problém je to nepodstatné.
Witiko
Profil
ah01:
Co myslíš, že udělá toto?
Zdá se, že klíčové slovo var skutečně přidá proměnnou jako vlastnost objektu window. Pamatuji si ale, že jsem četl článek, který se zabýval rozdílem mezi definicí funkcí pomocí klíčového slova var a zápisu bez něj. Nicméně šlo pravděpodobně jen o rozdíl při definici lokální proměnné. Především jde ale o nevalidní zápis definice proměnné, jenž nelze použít při definici lokální funkce a celkově není důvod proč ho používat, pokud se nesnažíme přistupovat k jinému oknu, nebo rámci. Funkčnost jsem nikdy nepopřel.

JS obecně konstanty nemá
Neříkám, že má. Vysvětloval jsem matematické pojmy, konstanta je nedílná součást matematiky a i každého programovacího jazyka. Nicméně pravdou je, že v současné době je IE jediný, kdo const nepodporuje. Ostatní prohlížeče většinově keyword podporují, ačkoliv byl odstraněn ze specifikace ECMAScriptu. Stále jde však velice zdařile konstanty simulovat za pomoci prototypu a privátních proměnných, které jsou přístupné jen z funkcí definovaných v konstruktoru daného prototypu, viz.: http://stackoverflow.com/questions/130396/are-there-constants-in-javascript

To není tak úplně pravda, ale pro tento problém je to nepodstatné.
Také důvod, proč jsem to označil jako laicky řečeno. Popisoval jsem to tak, aby to bylo srozumitelné a ve spojitosti s tímto problémem. Víc jsem to rozepsal, ačkoliv opět zjednodušeně v příspěvku nahoře:

... pokud definujeme proměnnou pomocí var uvnitř funkce, je jedinečná pro danou funkci a zaniká po jejím ukončení a ztrátě veškerých spojení jako jsou anonymní funkce, kterým je také přístupná.


Překládám ze stránky www.xul.fr:
Proměnná je pokládána za globální, pakliže je definována mimo definici funkce, nebo jiné struktury. Poté je viditelná v těle funkcí a ve strukturách volně ve scriptu, nebo uvnitř funkcí.

Proměnná definovaná ve funkci je viditelná uvnitř této funkce a těle jakékoliv struktury obsažené v dané funkci.
_es
Profil
ah01:
Pokud chceš definovat globální proměnnou (~ existující mimo funkci), je úplně jedno jestli použiješ var nebo ne.
Nie je to jedno, bez príkazu var vzniká zmazateľná globálna premenná.
Príkazom var sa definuje nezmazateľná globálna premenná, čo umožňuje použiť viac optimalizácií.
Kto by bol z toho málo domotaný, tak trebárs tu a tu si môže nad tým ďalej lámať hlavu.
Chamurappi
Profil
Reaguji na Witika:
Především jde ale o nevalidní zápis definice proměnné
V JavaScriptu nic jako (ne)validní zápis neexistuje a zrovna tento zápis je v souladu s gramatikou jazyka. Je určitě z několika důvodů nevhodný, ale proč strašit začátečníka nesmyslnými pojmy z úplně jiné pohádky?

jsem četl článek, který se zabýval rozdílem mezi definicí funkcí pomocí klíčového slova var a zápisu bez něj
Na určitý rozdíl tu narazil kolega _es (vida, tak už na něj i sám odkázal). Další anomálie je v tom, že v Exploreru automaticky vznikají reference na elementy podle jejich ID a pokud je na stránce element s id="x", tak při chybějícím varu přiřazení do proměnné x selže.

Ostatní prohlížeče většinově keyword podporují, ačkoliv byl odstraněn ze specifikace ECMAScriptu.
Nikdy nebyl odstraněn. Odjakživa je na seznamu budoucích vyhrazených klíčových slov, kterým by se měl programátor vyhýbat, a to i v páté edici z prosince 2009.
matesek
Profil
Tak tolik komentářů číst asi nebudu. Už to chápu, tak Díky všem. Kdybych nevěděl, tak to tady budu hledat.

Ještě by mě teda zajímal ten zápis proměnné do textu místo upozornění.
Chamurappi
Profil
Reaguji na mateska:
Ještě by mě teda zajímal ten zápis proměnné do textu místo upozornění.
Odpověď na začátku příspěvku [#8] (též k vidění uprostřed příspěvku [#10]) není dostatečně srozumitelná?

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:

0