„Zakres” odnosi się do zmiennych dostępnych w danym bloku kodu, w określonym czasie. Niezrozumienie pojęcia zakresu często sprawia, że męczymy się z uciążliwymi usterkami.
Zmienna zadeklarowana wewnątrz funkcji poprzez słowo kluczowe var dostępna jest tylko w obrębie tej funkcji — nie można więc skorzystać z takiej zmiennej poza tą funkcją. Dostęp do tej zmiennej będą mieć natomiast funkcje zdefiniowane wewnątrz tej funkcji.
Ponadto zmienne zadeklarowane wewnątrz funkcji bez słowa kluczowego var nie są dla danej funkcji zmiennymi lokalnymi — JavaScript przeglądnie cały łańcuch zakresu aż do zakresu okna by ustalić, gdzie zmienna ta została zdefiniowana. Jeśli nie znajdzie tej definicji, zmienna ta zostanie potraktowana jako globalna, co może mieć zupełnie nieprzewidywalne konsekwencje.
Przykład 2.44. Funkcje mają dostęp do zmiennych zdefiniowanych w obrębie tego samego zakresu
var foo = 'witaj';
var przywitajSie = function() {
console.log(foo);
};
przywitajSie(); // rejestruje witaj
console.log(foo); // również rejestruje witaj
Przykład 2.45. Kod znajdujący się poza zakresem, w którym została zdefiniowana zmienna, nie ma dostępu do tej zmiennej
var przywitajSie = function() {
var foo = 'witaj';
console.log(foo);
};
przywitajSie(); // rejestruje witaj
console.log(foo); // nic nie rejestruje
Przykład 2.46. Zmienne o takiej samej nazwie mogą znajdować się w różnych zakresach i przybierać różne wartości
var foo = 'świecie';
var przywitajSie = function() {
var foo = 'witaj';
console.log(foo);
};
przywitajSie(); // rejestruje witaj
console.log(foo); // rejestruje świecie
Przykład 2.47. Po zdefiniowaniu funkcja może „zobaczyć” zmiany w wartościach zmiennych
var mojaFunkcja = function() {
var foo = 'witaj';
var mojaFn = function() {
console.log(foo);
};
foo = 'świecie';
return mojaFn;
};
var f = mojaFunkcja();
f(); // rejestruje 'świecie' – ups
Przykład 2.48. Zakresy mogą nas często przyprawić o ból głowy
// samowykonująca się funkcja anonimowa
(function() {
var baz = 1;
var bim = function() { alert(baz); };
bar = function() { alert(baz); };
})();
console.log(baz); // baz nie jest zdefiniowany poza zakresem funkcji
bar(); // bar jest zdefiniowany poza zakresem funkcji anonimowej
// ponieważ nie został zadeklarowany przy pomocy słowa kluczowego var; ponadto
// ponieważ został zdefiniowany w tym samym zakresie co baz,
// bar ma dostęp do baz – zaś inny kod
// poza zakresem funkcji tego dostępu nie ma
bim(); // bim nie jest zdefiniowany poza zakresem funkcji anonimowej,
// w rezultacie wystąpi błąd





Wysyłam...
Dodaj komentarz