Am văzut până acum cum declarăm variabile și cum le folosim. Dar, oare le putem folosi oriunde? Nu chiar...
Să considerăm următorul program:
1 2 3 4 5 6 7 8 9 10 11 |
function test() { var n = 2457 if (n % 2 === 0) { alert("Număr par") } else { alert("Număr impar") } } test() alert(n) |
Poate ne-am aștepta ca totul să fie în regulă, dar nu e așa. Instrucțiunea din linia 11 nu are niciun efect fiindcă variabila n nu este cunoscută. Ar părea că am declarat această variabilă în linia 3. Dar, această declarație a fost făcută în interiorul funcției test și e valabilă doar acolo. De fapt, e mult mai "grav"; execuția programului se încheie; nicio instrucțiune care ar urma după linia 11 nu ar mai fi executată.
Spunem că o variabilă este vizibilă doar acolo unde este declarată. Evident, ea poate fi folosită doar acolo unde este vizibilă. Spunem că locul în care poate fi văzută o variabilă este domeniul de vizibilitate al variabilei.
Să vedem acum un exemplu mai interesant:
1 2 3 4 5 6 |
function test(n) { var n = 47 alert(n) } test(2457) |
În JavaScript este permis așa ceva; parametrul n este vizibil în cadrul funcției test, dar dacă în corpul acestei funcții avem o declarație a unei variabile cu același nume, începând din acel moment vom lucra cu noua variabilă.
Dacă au domenii de vizibilitate diferite, două variabile sunt diferite chiar dacă au aceeași denumire. Să vedem mai exact ce înseamnă acest lucru:
1 2 3 4 5 6 7 8 9 |
function test() { var n n = 47 alert(n) } var n = 2457 test() alert(n) |
Avem o variabilă n a cărei valoare este 2457. Apelăm funcția test; în cadrul acesteia avem o altă variabilă n cu valoarea 47 și afișăm valoarea acesteia. Execuția funcției se încheia și urmează afișarea variabilei n; se va scrie 2457, fiindcă variabila din interiorul funcției nu este vizibilă în afara funcției și atribuirea din linia 3 afectează doar variabila declarată în linia 2, nu și pe cea declarată în linia 7.
Trebuie să reținem faptul că orice instrucțiune care folosește o variabilă o folosește pe cea vizibilă, chiar dacă în alte locuri există variabile cu același nume. Să vedem un exemplu mai interesant:
1 2 3 4 5 6 7 8 |
function test(n) { n++ alert(n) } var n = 2457 test(n) alert(n) |
Vom vedea că în urma execuției instrucțiunii din linia 3, este scrisă valoarea 2458, dar în urma execuției instrucțiunii din linia 8, este scrisă valoarea 2457.
Avem o variabilă n definită în linia 6 și inițializată cu valoarea 2457. Aceasta este transmisă ca argument al apelului funcției test. În linia 2 valoarea parametrului funcției test este incrementată. Dar, deja avem o altă variabilă (parametrul); incrementarea se aplică doar asupra ei. Noua valoare este tipărită și execuția funcției test se încheie. Variabila definită în linia 6 nu a fost afectată de incrementarea din linia 3; ca urmare, în momentul executării instrucțiunii din linia 8, valoarea sa este tot 2457.
Există mecanisme prin care modificările aduse unui parametru al unei funcții să nu se piardă în momentul în care se încheie execuția funcției respective, dar vom reveni asupra acestui aspect la momentul oportun.
Situația este aceeași dacă variabila transmisă ca argument ajunge să devină un parametru cu alt nume. Efectul execuției următorului program este același:
1 2 3 4 5 6 7 8 |
function test(k) { k++ alert(k) } var n = 2457 test(n) alert(n) |
Va urma
Am văzut până acum cum putem avea instrucțiuni care să se execute sau nu (folosind instrucțiuni condiționale). Am văzut de asemenea cum putea avea instrucțiuni care sunt executate de mai multe ori (folosind apeluri multiple de funcții). Dar, trebuie să efectuăm câte un apel de fiecare dată când doream să executăm o funcție. În următorul episod vom introduce conceptul de buclă; vedea cum vom putea executa anumite instrucțiuni de mai multe ori, atâta timp cât o anumită condiție este îndeplinită.