Chápem, ako to funguje (rozdielymedzi lokálnymi a globálnymi funkciami), ale nemám dostatočné odôvodnenie skrytia globálnych premenných vo funkciách, zatiaľ čo miestna premenná ešte nie je definovaná alebo inicializovaná.
var scope = "global";
function checkscope() {
console.log(scope);
}
//this returns >> undefined
Čítam "Javascript: Definitívny sprievodca (6. vydanie)" a tu hovorím o kapitole 3.10. (presne na strane 54).
2 strany neskôr, na strane 56 kniha hovorí:
"V nesyntetizovanej funkcii sa oblasť rozsahu skladá z dvoch objektov. Prvým je objekt, ktorý definuje parametre funkcií a lokálne premenné a druhý je globálny objekt. "
Neznamená to, že globálne premenné, "vlastnosti" globálneho objektu, sa nachádzajú v reťazci rozsahu nesyntetizovanej funkcie? Nie je to v rozpore s tým, čo bolo povedané o 2 stránky skôr?
Nie som najlepší pri verbalizácii seba, tak dúfamvy chápete, okrem toho, že angličtina nie je môj rodný jazyk, takže sa ospravedlňujem, či je to len nedorozumenie významu textu z mojej strany.
odpovede:
8 pre odpoveď č. 1Podľa pripomienok je predmetný kód:
var scope = "global";
function checkscope() {
console.log(scope);
var scope;
console.log(scope);
}
Toto sa bude zaznamenávať undefined
dvakrát, ako var
vyhlásenia (ako aj funkčné deklarácie) sú zdvihol na začiatok aktuálneho rozsahu. Skript uvedený vyššie je interpretovaný ako:
var scope = "global";
function checkscope() {
var scope; //declaration hoisted up to top of scope
console.log(scope);
console.log(scope);
}
ako checkscope
má lokálne scope
premenná, miestna scope
premenlivý tiene vonkajší rozsah "s scope
variabilné.
Miestny scope
premenná nemá priradenú hodnotu, ktorá je ekvivalentná natívnemu jazyka JavaScript undefined
hodnota.
Bočná poznámka: Ak je vonkajšia oblasť v globálnej oblasti globálna, v prostredí prehliadača stále máte prístup k globálnemu scope
premenná pomocou odkazu na globálny objekt (window
):
var scope = "global";
function checkscope() {
var scope; //declaration hoisted up to top of scope
console.log(scope); //undefined
console.log(window.scope); //"global"
}
Ako vidíte, premenné deklarované v globálnom rozsahu sa stanú vlastnosťami window
objekt.
Tento trik nie je veľmi užitočný, keď vonkajší rozsah nie je globálny scope
premenná zostane tieňovaná, ak ju nepremenujete. Neexistuje žiadny štandardizovaný spôsob, akým viem, ako získať prístup k kontámy vykonávania tieňových vlastností (premenné / funkcie) nadradených sfér ".