Zakres zmiennej pętli JavaScript

Szybkie Pytanie o zakres zmiennych JavaScript.

Dlaczego funkcja alert() wypisuje wartość i zamiast zwracać undefined?

$(document).ready(function () {
    for(var i = 0; i < 10; i += 1){
    }

     alert("What is 'i'? " + i);
});

Jestem całkiem nowy w JS, i w prawie wszystkich innych językach, które paradowałem, deklaracja w zakresie pętli for zawierałaby wartość tej pętli, ale nie w tym przypadku, dlaczego?

Tj. What is 'i'? 10' jest drukowany.

Author: informatik01, 2013-08-27

5 answers

Zobacz MDN dla " parametry inicjalizacji" for-pętla :

Wyrażenie (w tym wyrażenia przypisania) lub deklaracja zmiennej. Zwykle używany do inicjalizacji zmiennej counter. Wyrażenie to może opcjonalnie zadeklarować nowe zmienne słowem kluczowym var. zmienne te nie są lokalne dla pętli, tzn. znajdują się w tym samym zakresie, w którym znajduje się pętla for. wynik tego wyrażenia jest odrzucany.

 58
Author: insertusernamehere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-27 12:22:23

JavaScript nie ma zakresu blokowego, tylko zakres funkcji. Ponieważ inicjalizacja i znajduje się w obrębie jednej funkcji, zmienna ta jest dostępna gdziekolwiek indziej w tej samej funkcji.

From MDN:

Ważne: JavaScript nie ma zakresu bloków. Zmienne wprowadzone za pomocą bloku są ograniczone do funkcji zawierającej lub skryptu, a efekty ich ustawienia utrzymują się poza samym blokiem. Innymi słowy, polecenia blokowe nie wprowadzają zakresu. Chociaż bloki" standalone " są poprawną składnią, nie chcesz używać bloków autonomicznych w JavaScript, ponieważ nie robią tego, co myślisz, że robią, jeśli myślisz, że robią coś takiego w C lub Javie.

 49
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-27 12:22:42

Ludzie javascript próbują to naprawić!

EcmaScript6 (aka EcmaScript 2015) to najnowsza wersja javascript, która została wydana latem ubiegłego roku, a przeglądarki dopiero zaczynają wspierać jego funkcje.

Jedną z tych cech jest zmienna lokalna typu block-scope z wyrażeniem "let". Obecnie (Kwiecień 2016) większość obecnych wersji głównych przeglądarek obsługuje to z wyjątkiem Safari. Kilka przeglądarek mobilnych to obsługuje.

Możesz przeczytać więcej na ten temat tutaj (w szczególności patrz sekcja " let-scoped variables in for loops"): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

Możesz sprawdzić bieżącą obsługę przeglądarki tutaj (poszukaj wiązań wierszy - > let): https://kangax.github.io/compat-table/es6/

 15
Author: Matt Coarr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 18:58:00

W przeciwieństwie do innych języków (na przykład: Java, C++, C), JavaScript nie obsługuje zakresu bloków. Gdy zadeklarujesz zmienną w pętli lub w funkcji, jej zakres znajduje się w ciele funkcji, jeśli wykonasz

for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}

Tutaj i staje się zmienną globalną i {[2] } staje się lokalną dla funkcji lub skryptu, w którym znajduje się pętla.

 9
Author: Hitesh Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-01 06:44:20
for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}

Nie jest poprawne stwierdzenie, że powyższe tworzy zmienną globalną i. Uważam, że zawsze powinieneś używać var do deklarowania zmiennych (chyba że celowo chcesz "właściwości", a nie "zmiennej" - co jest mało prawdopodobne w 99,99% scenariuszy kodowania JS ...)

Pominięcie var podczas przypisywania wartości początkowej do {[3] }nie jest tworzeniem zmiennej lokalnej lub nawet globalnej, jest tworzeniem właściwości i dla obiektu globalnego (który może wydawać się / zachowywać się głównie jak zmienna globalna - ale mają pewne subtelne różnice).

Lepiej byłoby:

var i;
for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}

Teraz pętla używa zmiennej globalnej i (lub zmiennej lokalnej funkcji i, Jeśli ten kod pojawia się w funkcji)

Zobacz więcej na ten temat w jaka jest funkcja słowa kluczowego var i zmienne A właściwości w Javascript

-- zauważ, że nieco mylące jest to, że możesz ponownie zadeklarować zmienną, na przykład w sekundę loop

for(var i=0; i<9; i++){
    document.write('i = ' + i + '<br>');
}


for(var i=0; i<9; i++){
    document.write('i = ' + i + '<br>');
}

To wydaje się być poprawne(żadnych błędów podczas testowania). Wydaje się, że można ponownie zadeklarować zmienne w JavaScript - ale prawdopodobnie nie każdy jest dobrym pomysłem, chyba że jest to szczególny przypadek-zobacz to powiązane pytanie, wspominając o tym, jak [Google Analytics korzysta z "bezpiecznej" redeclaracji zmiennej] ( Redeclaring zmiennej javascript)

Istnieje dyskusja na temat ponownej deklaracji zmiennych w JS (a także zmiennych pętlowych, takich jak i) w tym związanym więc pytaniu: zadeklaruj zmienne wewnątrz lub poza pętlą

Istnieje wzorzec JavaScript dla pojedynczej deklaracji zmiennych

 9
Author: Matt Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:53