Kicsit elméleti jellegű kérdés. Nem akarok nagyon próbálkozásból következtetni, mert előfordul, hogy egy böngésző engedékenysége miatt sikerül valami, aminek nem kellene, de engem a pontos válasz érdekel, hivatalos választ meg egyelőre még nem találtam. Van egy böngésző, abban a window, abban van egy document. A document-ben van JavaScript. Ez pl. kiajánl egy függvényt. Ezt én máshonnan window-ra hivatkozva elérem (pl. window.opener.fuggveny()). Egy window elvileg addig él, amíg be nem zárom a böngészőt, a document meg addig, amíg el nem navigálok máshova. Nekem az nem áll össze, hogy akkor miért nem a document-en keresztül érem el a másik ablak JavaScript dolgait? Vagy ez csak véletlen, hogy így (is) működik? Más szóval, a JavaScript kódok a window vagy a document kontextusába töltődnek be? Ha window a kontextus, akkor a JS motor kezeli azt le, hogy a document változásakor a window-ból kiszedi a korábbi document-hez tartozó dolgokat? Mert ugye hiába állítok be egy window.setTimeout-ot, ha elnavigálok, akkor az is eltűnik, pedig a window ugyanaz marad.
- 1474 megtekintés
Hozzászólások
Hamar eljárt a kezem, megvan a megoldás:
http://docstore.mik.ua/orelly/web/jscript/ch11_05.html
http://docstore.mik.ua/orelly/web/jscript/ch11_06.html
Tehát a kontextus implicite a window, de a lifetime mégis a document. Ez kavart meg. Vagyis egy JavaScript function/variable a window-ba kerül bele, de a document elnavigálásakor törlődik biztonsági, takarítási okokból.
- A hozzászóláshoz be kell jelentkezni
jaj, az elved jó, viszont a biztonsági kérdéseket kizárod.
Minden egyes navigáláskor új kontextus jön össze, a window objectet a böngésző adja (ez olyan mint a root, hivatkozhatsz rá, mert van neve, de ez az alapértelmezett is), a document az amibe a te dolgaid töltődnek be, majd a lefutó js-ed a window-ban fut le az előző ok miatt (ezért nem kötelező pl a settimout-ot helyett window.settimeout), a document a dom tree igazából, a két külön oldal közötti navigálásnál a kontextusok között átjárás nincs.
Vagyis amikor navigálsz, az előző "munkamenet" eltűnik és újragenerálódik minden (a window, a document (ami window.document eredetileg), etc.).
A parent azért marad, mert azt a böngésző állítja be a kontextus létrejötténél (engine init) és ez egy referencia pont a szülő kontextusára (a szülő konextusa is addig él, míg a szülő el nem navigál).
Szóval egészen pontosan, a kontextusod addig él, míg el nem navigálsz máshova
- A hozzászóláshoz be kell jelentkezni
Tehát nem az van, hogy a window megmarad, csak törlődik belőle minden, hanem a window is újragenerálódik, és a rá történő hivatkozásokat utánahúzza a böngésző? Mondjuk ez nagyon részletkérdés, akár implementációfüggő is lehet, a látható hatása ugyanaz.
- A hozzászóláshoz be kell jelentkezni
a window a root, a kontextus a "munkamenet", minden egyes navigáláskor a régit elveti és új munkamenet indul. Igazából implementáció függő, de a JS engine-ek, amikkel eddig találkoztam, nem voltak képesek egy adott kontextust resetelni, így a leállítás->törlés->új kontextus nyitása a mérvadó (firefox, chrome, ie tuti)
- A hozzászóláshoz be kell jelentkezni