Как построить JavaScript для цикла с функцией - PullRequest
0 голосов
/ 28 июня 2018

Я строю цикл для функции.

Функция loop принимает значение, тестовую функцию, функцию обновления и функцию тела. Каждая итерация сначала запускает тестовую функцию для текущего значения цикла и останавливается, если она возвращает false. Затем он вызывает функцию body, присваивая ей текущее значение. В конце концов, он вызывает функцию обновления для создания нового значения и запускается с начала.

loop(10, n => n > 0, n => n - 1, console.log);

function loop(a, b, c, d) {

    let currentValue = a;
    let i;
    for (i = 0; i < currentValue; i++) {
        if (b(currentValue)) {
            d(currentValue);
            update(c);

            function update(c) {
                var executeUpdate = c(currentValue);
                currentValue = executeUpdate;
            };
        } else {
            return;
        }
    };
}


// OUTPUT: 10, 9, 8, 7, 6

Почему эта функция останавливается на 6 вместо 1?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

function update(c) {
  var executeUpdate = c(currentValue);
  console.log('value of exeucteUpdate: ',executeUpdate, 'when i:', i)
  currentValue = executeUpdate;
};

Выполните console.log в вашей функции update, вы заметите, когда i == 4, executeUpdate равно 5, и вы обновили значение forloop, и, следовательно, цикл завершается в этом конкретном цикле

0 голосов
/ 28 июня 2018

Вы можете использовать несколько console.logs, чтобы увидеть его.

Фактически цикл for заканчивается, когда currentValue и i равны 5, поэтому условие не выполняется и цикл завершается.

Однако ваше состояние не имеет никакого смысла, вы сравниваете true с некоторым числом (как вы можете видеть в журналах)

loop(10, n => n > 0, n => n - 1, console.log);

function loop(a, b, c, d) {

    let currentValue = a;
    let i;
    for (i = 0; i < currentValue; i++) {
        console.log(i, currentValue);
        console.log(b(currentValue), currentValue)
        if (b(currentValue) < currentValue) {
            d(currentValue);
            update(c);

            function update(c) {
                var executeUpdate = c(currentValue);
                currentValue = executeUpdate;
            };
        } else {
            console.log('I am not here');
            return;
        }
    }
    console.log('finished', i, currentValue);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...