Global scope elérése (ECMAScript feladvány)
Azt mondják, a JavaScripttel az (az egyik) baj, hogy a globális változók használatát nem csak engedélyezi, hanem szinte kikényszeríti. Szerencsére nagy változást hozott ebben a tavaly decemberben elfogadott ECMAScript 5.
A kérdés: hogyan érhetjük el a kódon belül bárhonnan a globális scope-ot, avagy mit írjunk a megjegyzés helyére:Sajnálatos tapasztalat, hogy a legtöbb helyen (és sok keretrendszerben) szimplán
Figyelem: olyan kódot szeretnénk, ami tetszőleges szabványkövető ES5 környezetben a globális scope-ot adja meg (tehát strict módban is működnie kell).
Két különböző megoldás van.
■ A kérdés: hogyan érhetjük el a kódon belül bárhonnan a globális scope-ot, avagy mit írjunk a megjegyzés helyére:
var globalScope = /* ... */;
window
szerepel itt, ami ugye, több okból is aggályos: - a
window
elfedhető egy hasonló nevű lokális változóval
- a
window
nem minden környezetben létezik (lásd: WebWorker, Server Side JS)
Figyelem: olyan kódot szeretnénk, ami tetszőleges szabványkövető ES5 környezetben a globális scope-ot adja meg (tehát strict módban is működnie kell).
Két különböző megoldás van.
Talán…
self
vagy acontent
. De nem vagyok benne biztos, hogy ezek nem DOM-ban vannak csak.geval
Ez az egyik
Lehet egy sorban is:
(0, eval) notation
(0, eval)
jelölés zseniális.Szabad-e kérdezni?
Ha van egy lista kifejezésed,
0, eval
tehát azeval
-lal tér vissza (indirekten hivatkozunk rá). Az így kapott függvényreferenciát hívjuk meg a'this'
argumentummal.0, eval
jelölésre, elég volna ageval = eval
, közvetlen hívásnál viszont máskülönben nem teljesülne az indirekt hívás. A0
helyett gyakorlatilag bármilyen kifejezés írható, sőt, tetszőleges elem felsorolható a kifejezésbe.Világos
A lista eme tulajdonságát nem ismertem.
Perl
Üdv:
Gábor
1999
Zsír!
Azért itt más dátumot látok:
Ecma-262
Üdv:
Gábor
Kontextus
Egyébként semmi perles nincs benne, a C-ben is pont így működik a vessző operátor, ’72 óta. (Előzményéről nem tudok, sem BCPL-ben, sem Fortranban, sem Algolban.)
Szokás
„a kódon belül bárhonnan”
undefined
dal, tökéletes.Nekem nem tetszik
Praktikusan jó a megoldás, viszont hivatkozik Node.js-re, de ott nincsen sem window, sem [window.]document (de még böngészőben sem feltétlenül, lásd Web Worker). Szerintem célszerű a dolgokat a nevükön nevezni: ha a global scope kell, akkor ne window-nak hívjuk.
+1
Web Worker
window
. Másfelől ha a szerver oldali kód is JS, újrafelhasználható komponensek írásához nem hard-code-olhatod awindow
-t.Hát nálam ezek speciális
.call(null)
Nem jó
undefined
értéket kap athis
. BESEN-nel tesztelhetők a példák.A kódod amúgy pont annak példája, amivel megállapítható, hogy a strict mode támogatott-e.
Második megoldás
jó a kérdés
ECMAScript 5 esetén a strict módban a this-ből nem lesz automatikusan global scope, így a kérdést úgy fogalmazhatnám meg másképpen, hogy hogyan lehet egy strict kódon belül nem strict módba jutni?
Remélem, segített.
Function konstruktor
Function
constructor do not inherit the strictness from the surrounding context. (Forrás: ECMA-262-5 in detail. Chapter 2. Strict Mode.)nyertél
Az miért nem jó, hogy
Mondjuk:
mert nem ez volt a
Tyrael
ok.