Autor Zpráva
zivan
Profil
Kde najdu jake jsou rozdily ve verzich javascriptu (prip. jscriptu, ECMAScriptu)?

Napr. IE v PDA je zrejme verze 4.0 (W2003), tak bych chtel vedet co vsechno muzu pouzit, aby to tam chodilo.
Chamurappi
Profil
Co se týče JScriptu, rozpis jednotlivých verzí je na MSDN (nebo tady vč. NETí varianty).

Specifikaci třetí edice ECMAScriptu nabízí ke stažení ECMA. Je z konce roku 1999, podpora v současných prohlížečích je znamenitá. Akorát Explorer 5.0 z počátku téhož roku neumí pár drobností, které většinou lze snadno doskriptovat.


Drobná odbočka pro ty, kdo by se chtěli ponořit hluboko do útrob ECMAScriptu:
Vzpomněl jsem si na jednu zvláštní nekompatibilitu, která přežívá i mezi současnými prohlížeči. Kód vypadá takto:
var a = new Object();
a.x = 47;
x = 42;
with(a)
{
    function n()
    {
        return x;
    }
}
Otázka zní: Kolik má podle specifikace vrátit n()? 42 nebo 47?
habendorf
Profil
Chamurappi: IMHO 47
peta
Profil *
Chamurappi

... je to zajimave
with(a) zpusobi to, ze prepise vsechny promenne se stejnym nazvem. To logika volani podprogramu povoluje, kdyz po ukonceni je navrati.
Coz se take stane:
<script>
var a = new Object();
a.x = 47;
var x = 42;
with(a)
{
function n()
{return x;}
alert(n());
}
alert(x);
</script>
Cili v tomto je to logicky v poradku, ale ztracis pristup na globalni promennou.
Mozna bych spise ocekaval, ze navrati 42, protoze n() je globalni funkce, ale je to prave dost sporne prave kvuli tomu, ze jsem si definoval zamerne with, ktere mi to prepise.

Mimochodem, nekdo mi psal, ze with neni dobre pouzivat a JS konzola firefoxu na nem obcas vyhodi varovani.
Chamurappi
Profil
Ještě je zajímavé, že Netscape 4 nevrátí na zavolání n() nic. V něm ta funkce totiž není, pro něj existuje jen metoda a.n(). Což také dává jistý smysl.
ah01
Profil
Chamurappi
with změní obor platnosti (Scope). Resp. přidá a na začátek jakéhosi interního seznamu (Scope chain), podle kterého se hledá hodnota x. V rámci tohoto oboru je následně definovaná fce. n. Vzhledem k tomu, že funkce je při spuštění, vyhodnocována v rámci oboru, ve kterém byla definována, měla by fce. n vrátit 47. Aspoň tak to chápu já.

Chtěl jsem si to ověřit v reálu, takže spustím FF a výsledek je 47. Pak zkusím IE a obdržím 42. Zkoušel jsem ještě Operu – 42. Je to asi ve schodě s tím co píšeš o nekompatibilitě.

Zkoušel jsem pak ještě něco, až jsem došel k tomuto kódu.
var a = new Object();

a.x = 47;
x = 42;
with(a)
{
function n()
{
return x;
}
m = function ()
{
return x;
}
}
A docela mě zarazilo, že IE a Opera vrátí u n() 42 a u m() 47! Doteď jsem si myslel, že oba zápisy by měly být totožné a podle specifikace snad i jsou. V tomto případě to ale asi souvisí s problémy s with (?).
Chamurappi
Profil
Reaguji na ah01:
Doteď jsem si myslel, že oba zápisy by měly být totožné
Já si to donedávna též myslel, ale příklad tady mě přesvěčil, že tam asi nějaký rozdíl bude. Zdá se, že pojmenovanou funkci lze volat dříve, než je definovaná v kódu, na rozdíl od anonymní funkce přiřazené do něčeho. Tento poznatek trochu zacloumá i s představou o oboru platnosti, že?
los
Profil *
Zaujímalo by ma, podľa akých odvodzovacích pravidiel gramatiky si sa dostal k tomu oriešku - konkrétne sa mi nepodarilo nájsť pravidlo, ktoré by dovoľovalo vytvoriť konštrukciu: with(a) { function n() { return x; } }
_es
Profil
V inom vlákne som to dal ako zaujímavý príklad, no celkom to nesedelo do témy, preto to dávam radšej sem.
Ide o výsledok tohoto JS odkazu v rôznych prehliadačoch:
javascript:name=1;alert(name===1);
V rôznych prehliadačoch je výsledok rôzny.
Zaujímalo by ma, kto dá rozumné vysvetlenie.
Ja isté mám, no nechcem ovplyvňovať iných.
Pomocné tvrdenie platné pre (skoro) všetky prehliadače:
Vlastnosť window.name, pomenúvajúca okno, vždy exituje a môže byť len textový reťazec. Prehliadače nezakazujú ani hodnotu "1".
_es
Profil
Z Jak dobře znáte JavaScript - předveďte se [kvíz] by sa mohli zmazať alebo premiestniť niektoré príspevky, tohoto sa týkajúce.
Moderátor Joker: Asi nevadí, když to je i tam... jelikož s tím stejně dva měsíce nikdo nic neudělal, jen zruším moderátorskou volačku
Zatiaľ som to s globálnymi vlastnosťami pochopil tak, že podľa definície existujú rôzne druhy globálnych premenných a vlastností (s názvom x):
1) Globálna vlastnosť vytváraná prehliadačom ešte pred všetkými skriptami. Nemusí to byť len obyčajná vlastnosť, ale pri zápise môžu byť jej hodnoty konverzované a jej zmena môže nejako priamo vplývať na prehliadač. Také vlastnosti obvykle nejdú zmazať. Napríklad vlastnosť name.
2) Globálna premenná definovaná: var x = hodnota;. Taká premenná nejde zmazať operátorom delete.
3) Globálna premenná definovaná: x = hodnota;. Taká premenná ide zmazať operátorom delete.
4) Globálna vlastnosť definovaná: window.x = hodnota alebo window["x"] = hodnota;. Taká vlastnosť ide zmazať operátorom delete.
Takže k tomu krátkemu kódu:
Existuje vlastnosť name typu 1.
Niektoré prehliadače prvý príkaz pochopia tak, že to je príkaz týkajúci sa tejto vlastnosti, na hodnotu 1 sa použije konverzia na reťazec a hodnota "1" bude výslednou hodnotou vlastnosti name. Preto bude mať porovnanie v ďalšom príkaze hodnotu false.
Niektoré prehliadače zase prvý príkaz pochopia tak, že sa má vytvoriť nová premenná typu 3. Tá bude mať hodnotu 1 a prekryje svojim názvom pôvodnú vlastnosť typu 1. Preto bude mať porovnanie v ďalšom príkaze hodnotu true.
Že to naozaj asi tak nejako je, sa dá overiť na tomto JS odkaze:
javascript:window.name=1;alert([name, typeof name]);name=1;alert([name, typeof name]);try{delete name;}catch(e){}alert([name, typeof name]);
Pre prehliadače, správajúce sa podľa druhého popisu ide tá prekrývajúca premenná zmazať.
_es
Profil
Našiel som zvláštnu odchýlku pre Operu, tá vypíše "0", ostatné prehliadače, čo som skúšal, vypíšu "x".
javascript:Number.prototype.valueOf=Number.prototype.toString=function(){return "x";};alert(new Number(0))

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