Autor | Zpráva | ||
---|---|---|---|
zivan Profil |
#1 · Zasláno: 15. 3. 2006, 17:04:32
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 |
#2 · Zasláno: 16. 3. 2006, 01:03:07 · Upravil/a: Chamurappi
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; } } |
||
habendorf Profil |
#3 · Zasláno: 16. 3. 2006, 10:11:31
Chamurappi: IMHO 47
|
||
peta Profil * |
#4 · Zasláno: 16. 3. 2006, 10:16:38
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 |
#5 · Zasláno: 16. 3. 2006, 21:37:09
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.
|
||
Časová prodleva: 1 rok
|
|||
ah01 Profil |
#6 · Zasláno: 14. 9. 2007, 19:01:40 · Upravil/a: ah01
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 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 |
#7 · Zasláno: 14. 9. 2007, 19:22:16
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? |
||
Časová prodleva: 5 měsíců
|
|||
los Profil * |
#8 · Zasláno: 5. 2. 2008, 17:08:39
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; } }
|
||
Časová prodleva: 2 roky
|
|||
_es Profil |
#9 · Zasláno: 12. 2. 2010, 09:55:01
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); 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". |
||
Časová prodleva: 13 dní
|
|||
_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]); |
||
Časová prodleva: 1 rok
|
|||
_es Profil |
#11 · Zasláno: 28. 4. 2011, 18:43:24
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)) |
||
Časová prodleva: 13 let
|
0