/ / Javascript - Prečo sú globálne premenné skryté v celej (telo) funkcie? - javascript, objekt, globálne premenné, rozsah

Javascript - Prečo sú globálne premenné skryté vo funkcii (telo)? - javascript, objekt, globálne premenné, rozsah

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ď č. 1

Podľ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 ".