Почему «я» изменяется для вложенных циклов в другой функции? - PullRequest
0 голосов
/ 04 апреля 2019

Я обнаружил некоторые странные поведения в своем коде и, наконец, отследил его до того, что я считал невозможным.Переменная «i», используемая в цикле for, изменяется внутри замкнутого цикла for для другой функции.

В этом случае функция a записывает только 0, а функция b 0-9.Я хотел, чтобы обе функции записывали в журнал 0-9.

Я решил проблему в своем коде, изменив имя переменной 'i1' и 'i2'.Но я предполагаю, что есть более элегантное решение.

function a() {

    for (i=0;i<10;i++) { // Changed to i1
    console.log('a',i);
    b() ; }

}

function b() {
    for (i=0;i<10;i++) { // Changed to i2
        console.log('b',i);
    }
}

a() ;

Ответы [ 4 ]

2 голосов
/ 04 апреля 2019

Используйте let при объявлении локальных переменных. В противном случае, как уже упоминали другие, i становится глобальным.

function a() {

    for (let i=0;i<10;i++) {
    console.log('a', i);
    b(); }

}

function b() {
    for (let i=0;i<10;i++) {
        console.log('b', i);
    }
}

a();

Совет: как правило, лучше использовать let сверх var. Это поможет вам ограничить область действия ваших локальных переменных. В приведенном выше примере использование let ограничивает область действия i внутри цикла, тогда как var установит всю функцию в качестве области действия (попробуйте использовать var и распечатать значение i после цикла ).

0 голосов
/ 04 апреля 2019

способ использования i заставляет javascript рассматривать его как глобальную переменную. В других языках переменная i может быть локальной по умолчанию для области цикла for, но javascript не работает таким образом. Javascript разработан так, что переменные являются глобальными по умолчанию. Вы можете ограничить область видимости переменных функцией с помощью var , например:

function a() {

    for (var i=0;i<10;i++) {
        console.log('a',i);
    b() ; }

}

Обратите внимание, что это i для функции , , а не для цикла for, как вы можете. Вы можете использовать более новое ключевое слово let для определения переменных с более детальной областью видимости (начиная с ES2015). Вот пример, в котором переменная i ограничена только для цикла (не функция):

function a() {

    for (let i=0;i<10;i++) {
        console.log('a',i);
    b() ; }

}
0 голосов
/ 04 апреля 2019

Есть несколько вопросов. Один из них заключается в том, что переменная i должна быть объявлена ​​в цикле for:

for (i=0;i<10;i++)

следует изменить на

for (let i=0;i<10;i++)

Другое изменение, которое нужно сделать, - это функция b, которая должна вызываться вне цикла. Полное решение будет:

function a() {
    for (let i=0;i<10;i++) {
        console.log('a',i);
    }
    b();
}

function b() {
    for (let i=0;i<10;i++) {
        console.log('b',i);
    }
}

a();
0 голосов
/ 04 апреля 2019

Вы добавляете i в объект Global window, это будет работать так, как вы ожидаете:

function a() {

    for (var i=0;i<10;i++) { // Changed to i1
    console.log('a',i);
    b() ; }

}

function b() {
    for (var i=0;i<10;i++) { // Changed to i2
        console.log('b',i);
    }
}

a();

Место "использовать строгое"; в верхней части каждого файла Javascript, и вы никогда больше не встретите такую ​​странность. Разместите «используйте строгий» в верхней части вашего Javascript сейчас. Вы увидите, что в обоих случаях есть ошибка, потому что вы объявляете их с ключевым словом var.

Когда вы начали, вы объявили i в своем первом цикле for (i=0;i<10;i++), вы поместили i в глобальную область видимости: window.i. Таким образом, оба цикла for используют одну и ту же переменную window.i.

Второй цикл for в функции b не объявляет новую переменную i, глобальная переменная i используется, потому что она была создана в функции a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...