Javascript Не меняется значение переменной, объявленной во внешней области

Имеется функция, внутри которой объявлена переменная (let breakFlag). Ниже по коду выполняю некоторые действия и в одном из переходов в switch case переключаю breakFlag в противоположное состояние. Однако, исходя из вывода в консоль вижу, что в switch case меняется не тот breakFlag, который я создавал выше, а какой-то еще. По-крайней мере это выглядит так... Не отрабатывает проверка

(breakFlag != 1) && (actCounter > 0)

и цикл продолжает выполнятся.

Пробовал пересобрать конструкцию switch case на if-ах, но результат тот же.

Вот кусок кода:

function GenomVM(botObject, worldObj) {
    let breakFlag = 0;
    let actCounter = 16;
    let adr = 0;

    let energy = botObject.energy;
    let direction = botObject.direction; // * направление взгляда бота 1 сев, 2 сев-вос, 3 восток ... 8 сев-зап, 0 - никуда
    let posX = botObject.posX;
    let posY = botObject.posY;

    let botGenom = botObject.genom;

    while ((breakFlag != 1) && (actCounter > 0)) {
        console.log(`Action counter: ${actCounter}`);
        console.log(`BreakFlag : ${breakFlag}`);
        switch (botGenom[adr]) {
            case 0: // Mutate random gen
                adr = incAdr(adr);
                genomMutate(botGenom);
                actCounter--;
                break;
            case 1: // Move front
            // Понять, что за координаты спереди (по линии взгляда)
            // Если не смотрит никуда (спит), то переходим к команде в адресе +1
            // Если спереди есть стена, то переходим к команде в адресе +2
            // Если спереди не пустое пространство и не стена, то переходим к команде в адресе +3
            // Если спереди пустое пространство, то шагаем на клетку вперед переходим к команде +4
                let frontCoordinates = getFrontCellCoordinates(direction, posX, posY);
                let frontObjectType;
                let frontX;
                let frontY;
                if (frontCoordinates != -1) {
                    frontX = frontCoordinates[0];
                    frontY = frontCoordinates[1];
                    frontObjectType = worldObj[frontX][frontY].objType;         
                };
                if (direction == 0) {
                    adr = incAdr(adr);
                } else {
                    if (frontObjectType == 'wall') {
                        adr = jumpAdr(adr, 2);
                    } else if ((frontObjectType == 'bot') || (frontObjectType == 'tree') || (frontObjectType == 'mineral')) {
                        adr = jumpAdr(adr, 3);
                    } else if (frontObjectType == 'space') {
                        botMove(posX, posY, frontX, frontY);
                        adr = jumpAdr(adr, 4);
                        breakFlag = 1; // Перемещение это прерывающая активность операция //! ToDo: не понятно, почему не меняет флаг
                        console.log(`Set breakFlag to ${breakFlag}`);
                    };
                };
                actCounter--;
                break;
            case 2: // Bot change direction right
                adr = incAdr(adr);
                direction = botObject.direction = botChangeDirection(direction, 'rigth');
                actCounter--;
                break;
            case 3: // Bot change direction left
                adr = incAdr(adr);
                direction = botObject.direction = botChangeDirection(direction, 'left');
                actCounter--;
                break;
            case 4:
                adr = jumpAdr(adr, 4);
                actCounter--;
                break;
            case 5:
                adr = jumpAdr(adr, 5);
                actCounter--;
                break;
            default:
                adr = 0;
                breakFlag = 1;
                break;
        }
    }
}

botGenom это массив чисел от 0 до 5 и длиной 16.

Возможно надо иначе объявить этот breakFlag, но логика подсказывает, если он объявлен во внешней области видимости функции, то должен быть виден и во внутренней...

Запускаю в vscode, используя nodejs: node world_zero.js

Полная версия кода тут


Ответы (1 шт):

Автор решения: Aziz Umarov

Если у вас проблемы такого рода Думаю Вам поможет просто переименование переменной на breakFlag1 и проверить что получится.

let a = 0;
function first(){
 let a = 1;
 second();
 function second()
 {
  a = 2
 } 
 console.log(a);
}
console.log(a);

first();

console.log(a);

→ Ссылка