510
Rozdział 11 .
Zagnieżdżanie funkcji i ich zasięg
Jaki wpływ na zasięg ma zagnieżdżanie funkcji?
Funkcje zdefiniowane na głównym poziomie kodu mają zasięg globalny, natomiast
funkcje zdefiniowane wewnątrz innych funkcji mają zasięg lokalny. Przeanalizujemy
kod przedstawiony na poprzedniej stronie i sprawdzimy, jaki zasięg mają
poszczególne funkcje. Jednocześnie zastanowimy się, gdzie każda z tych funkcji
zostanie zdefiniowana (bądź też, gdzie będzie niezdefiniowana).
Wszystko, co zostało zdefiniowane na
najwyższym poziomie kodu, ma zasięg
globalny. Dlatego zarówno fly, jak
i quacker będą zmiennymi globalnymi.
Funkcja wingFlapper jest definiowana przy
użyciu deklaracji umieszczonej wewnątrz
funkcji fly. Zatem jej zasięg obejmuje całą
funkcję fly i będzie ona zdefiniowana w całym
obszarze ciała tej funkcji.
Funkcja quacker jest definiowana przy użyciu
wyrażenia funkcyjnego, umieszczonego
wewnątrz funkcji quack. A zatem jej zasięg
obejmuje całą funkcję quack, jednak będzie
ona zdefiniowana od momentu przetworzenia
wyrażenia funkcyjnego aż do końca funkcji
quack.
var migrating = true;
var fly = function(num) {
var sound = ”Latam!”;
function wingFlapper() {
console.log(sound);
}
for (var i = 0; i < num; i++) {
wingFlapper();
}
};
function quack(num) {
var sound = ”Kwak!”;
var quacker = function() {
console.log(sound);
};
for (var i = 0; i < num; i++) {
quacker();
}
}
if (migrating) {
quack(4);
fly(4);
}
Funkcja quacker będzie zdefiniowana
tylko w tym fragmencie kodu.
Pamiętaj jednak, że funkcja fly będzie
zdefiniowana dopiero po przetworzeniu
wyrażenia funkcyjnego.
Zauważ, że reguły określające, kiedy można się odwoływać do
funkcji, są takie same wewnątrz funkcji, jak i na poziomie globalnym.
A zatem jeśli jesteśmy wewnątrz funkcji i funkcja zagnieżdżona została
zdefiniowana
przy użyciu deklaracji, to funkcja ta będzie zdefiniowana
w całym obszarze funkcji zewnętrznej. Z drugiej strony, jeśli funkcja
wewnętrzna została zdefiniowana
przy użyciu wyrażenia funkcyjnego,
będzie ona zdefiniowana wyłącznie po jego przetworzeniu.
P
: Kiedy przekazujemy wyrażenie funkcyjne
do innej funkcji, to przekazywana funkcja musi
zostać zapisana w parametrze, a następnie,
wewnątrz funkcji zewnętrznej, jest traktowana
jako zmienna lokalna. Czy tak?
O
:
Dokładnie tak. Przekazywanie funkcji jako
argumentu wywołania innej funkcji powoduje
skopiowanie referencji do funkcji przekazywanej
i zapisanie jej w zmiennej parametru funkcji
wywoływanej. A taki parametr zawierający referencję
do funkcji, jak każdy inny parametr, jest zmienną lokalną.
głupie pytania
Nie istnieją
jesteś tutaj
511
Funkcje anonimowe, zasięg i domknięcia
var secret = "007";
function getSecret() {
var secret = "008";
function getValue() {
return secret;
}
return getValue;
}
var getValueFun = getSecret();
getValueFun();
Próbka nr 2
Potrzebujemy eksperta do spraw funkcji pierwszej klasy i słyszeliśmy, że Ty nim jesteś!
Poniżej
znajdziesz dwa fragmenty kodu i musisz nam pomóc w określeniu, co wykonują, bo utknęliśmy. Dla nas oba
fragmenty wyglądają prawie identycznie, z tą różnicą, że jeden używa funkcji pierwszej klasy, a drugi nie.
Napodstawie naszej wiedzy o zasięgu w języku JavaScript oczekiwaliśmy, że próbka nr 1 zwróci wartość
008
,
apróbka nr 2 wartość
007
. A jednak obie próbki zwracają wartość
008
! Czy możesz nam pomóc w zrozumieniu,
dlaczego tak się dzieje?
JavaScriptowe wyzwanie ekstremalne
var secret = "007";
function getSecret() {
var secret = "008";
function getValue() {
return secret;
}
return getValue();
}
getSecret();
Próbka nr 1
Sugerujemy, żebyś przyjął
zdecydowaną opinię,
zapisał ją na tej stronie,
a następnie odwrócił kartkę.
Jeszcze nie patrz na
rozwiązanie zamieszczone
pod koniec rozdziału,
wrócimy do tego wyzwania
nieco później.
Get Programowanie w JavaScript Rusz głową! now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.