Jak działa ta funkcja w JavieScript?

0

Witajcie,

w poniższym kodzie return highScore; zwraca wartość do zmiennej var highScore = 0, czy tak?

var scores = [60, 50, 60, 58, 54, 54,
                      58, 50, 52, 54, 48, 69,
                      34, 55, 51, 52, 44, 51,
                      69, 64, 66, 55, 52, 61,
                      46, 31, 57, 52, 44, 18,
                      41, 53, 55, 61, 51, 44];

function printAndGetHighScore(scores) {
		    var highScore = 0;
		    var output;
		    for (var i = 0; i < scores.length; i++) {
		        output = "Płyn do baniek nr " + i + " wynik: " + scores[i];
		        console.log(output);
		        if (scores[i] > highScore) {
		            highScore = scores[i];
		        }
		    }
		    return highScore;
		}

i teraz..dlaczego zaraz poniżej jest ten kod:

var highScore = printAndGetHighScore (scores);


przecież mamy już w zmiennej var highScore wartość zapisaną z tego pierwszego kodu.

Jak to w końcu działa?

1

Poczytaj o zasięgu zmiennych (variable scope), zmienna deklarowana w funkcji nie będzie widoczna poza nią, więc są to różne zmienne. Podobnie jak ulica Mickiewicza w Warszawie nie będzie tą samą ulicą, co ulica Mickiewicza w Krakowie.

zwraca wartość do zmiennej var highScore = 0, czy tak?

Funkcja zwraca wartość nie do zmiennej, tylko ogólnie. To, że sobie deklaruje zmienną lokalną ( var highScore = 0;), o tym już inne funkcje nie mają świadomości.

0

No tak. To w takim razie ta druga zmienna var highScore o tej samej nazwie będzie przechowywać inne wartości? Czy z tego kodu nie wynika, że przechowa takie same?

1

Będzie przechowywać inne wartości, bo ta wewnętrzna nazwa "przesłoni" widoczność tamtej. Trochę jak np. w Gdańsku słowo "prezydent" może(czy raczej mogło) się odnosić do Adamowicza, mimo, że w całej Polsce do Dudy.

var a = 1;
function foo() {
    var a = 20;
    a = a + 10; 
    console.log("foo", a); // 30
}
var a = 123;
foo(); 
console.log("poza funkcją", a); // 123
0

Ok, proszę dopisz jeszcze jakie więc wartości przechowa zmienna globalna, inne od tej zmiennej we funkcji?

Gdy dopiszę linię

console.log ("Największa liczba wytworzonych baniek: " + highScore);

to która zmienna zostanie odczytana? Ta globalna? Dlatego, że jest niżej w kodzie?

1

Nazwa będzie wskazywała do najbardziej wewnętrznej zmiennej (wewnętrznej biorąc pod uwagę miejsce, w którym się odpala dany kawałek kodu).

To działa na zasadzie hierarchii (funkcje można zagnieżdżać i każda zagnieżdżona funkcja może definiować zmienne, które przysłonią automatycznie te bardziej zewnętrzne. Od wersji ES6 można też robić zmienne let i const, które mają zasięg blokowy (widoczne tylko między klamerkami: {, } ), więc możesz zrobić zagnieżdżone bloki i jakąkolwiek zmienną być nie użył, będzie ona szukana najpierw w środku, a potem dopiero na zewnątrz.

Tylko to nie działa w bok, ani w głąb. Jak jesteś poza funkcją printAndGetHighScore to nie odwołasz się do zmiennej, która jest w środku, bo nie będziesz mieć zasięgu.

Jest taka książka dostępna on-line, która to bardziej dogłębnie tłumaczy: https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20%26%20closures/ch1.md

1 użytkowników online, w tym zalogowanych: 0, gości: 1