Un domeniu este o serie de instrucțiuni JavaScript consecutive cu un început și un sfârșit clar definite. JavaScript cunoaște patru tipuri de domenii: bloc, funcție, modul și domeniu global. În funcție de tipul declarației și de locația declarației, variabilele sunt în astfel de domenii. Ele sunt „vizibile”, respectiv „accesibile” numai în cadrul lor. Dacă încercați să le accesați din exterior, va apărea o eroare.
Domeniul bloc
O pereche de paranteze {}
creează un bloc. Variabilele declarate într-un bloc prin let
sau const
sunt legate de acest bloc și nu pot fi accesate în exterior.
"use strict";
let a = 0;
// ...
if (a == 0) {
let x = 5;
alert(x); // arată numărul 5
} else {
alert(x); // ReferenceError (cu un 'a' diferit)
}
alert(x); // ReferenceError
Variabila x
este declarată în interiorul unui bloc (în acest exemplu simplu, blocul este format din doar două linii.) Nu este accesibilă în spatele capătului blocului, care este paranteza de închidere } din linia
. Același lucru este valabil și în cazul în care variabila
elsex
este declarată cu const
în loc de let
.
Aveți grijă cu cuvântul cheie var
; semantica lui este diferită! În primul rând, var
nu este în domeniul bloc. În al doilea rând, duce la o tehnică numită hoisting, care a fost folosită în JavaScript încă din primele zile. Hoisting schimbă semantica diferitelor declarații „pe ascuns”. În ceea ce privește var
, împarte declarația și inițializarea în două instrucțiuni separate și mută partea de declarație în partea de sus a domeniului curent. Prin urmare, variabila este declarată, dar nu inițializată dacă o utilizați înainte de linia în care este declarată în sursă.
Scriptul
"use strict";
alert(x); // undefined, not ReferenceError !
x = 1; // correct, despite of "use strict"
alert(x); // shows 1
var x = 0;
este schimat în
"use strict";
var x;
alert(x); // undefined, not ReferenceError !
x = 1;
alert(x); // shows 1
x = 0;
Pe de altă parte, cuvântul cheie let
păstrează declarația în linia în care este scrisă.
"use strict";
alert(x); // ReferenceError
x = 1; // ReferenceError
alert(x); // ReferenceError
let x = 0;
Există mai multe diferențe. Iată o versiune a primului exemplu al acestui capitol care înlocuiește let
cu var
:
"use strict";
let a = 0;
// ...
if (a == 0) {
var x = 5; // 'var' instead of 'let'
alert(x); // shows the number 5
} else {
alert(x); // ReferenceError (with a different 'a')
}
alert(x); // shows the number 5 !!
Vă recomandăm să evitați complet var
din două motive:
- Tehnica hoisting a JavaScript nu este ușor de înțeles.
- Alți membri ai limbajelor din familia C nu o cunosc.
În loc să utilizați var
, utilizați cuvântul cheie let
.
Domeniul de aplicare funcție
O funcție își creează propriul domeniu de aplicare. Variabilele declarate în domeniul de aplicare al funcției nu pot fi accesate din exterior.
"use strict";
function func_1() {
let x = 5; // x poate fi utilizat doar în func_1
alert("Inside function: " + x);
}
func_1();
alert(x); // Cauzează o eroare
Domeniul de aplicare al funcției este uneori numit domeniu local, deoarece acesta era numele în versiunile ECMAScript mai veche.
Domeniul de aplicare modul
Este posibil să împărțiți scripturi uriașe în mai multe fișiere și să lăsați funcțiile și variabilele să comunice între ele. Fiecare fișier își creează propriul domeniu de aplicare, domeniul de aplicare al modulului. Capitolul Module explică mai multe despre asta.
Domeniul de aplicare global
Variabilele sau funcțiile sunt în domeniu global dacă sunt declarate la nivelul superior al unui script (în afara tuturor blocurilor și funcțiilor).
"use strict";
let x = 42; // 'x' aparține domeniului global
// definește o funcție
function func_1() {
// folosește variabila contextului global
alert("In function: " + x);
}
// pornește funcția
func_1(); // arată "In function: 42"
alert(x); // arată "42"
x
este declarat la nivelul superior, prin urmare se află în domeniul global și poate fi folosit peste tot. Dar în exemplul următor declarația lui x
este cuprinsă de { }
. Prin urmare, nu mai este în domeniu global.
"use strict";
{
let x = 42; // 'x' nu este în domeniul global
}
alert(x); // ReferenceError
Sugestie: Utilizarea domeniului de aplicare global nu este considerată o bună practică. Are tendința de a crea efecte secundare nedorite. În schimb, încercați să vă modularizați codul și să lăsați părțile să comunice prin interfețe.
(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)
Lasă un răspuns