5.2 Красноречивый Javascript - 3-е издание - PullRequest
0 голосов
/ 04 октября 2018

Относительно новичок в программировании, ищет объяснение вопроса в главе 5 Eloquent Javascript.

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

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

loop(3, n => n > 0, n => n - 1, console.log); // → 3 // → 2 // → 1

Ответ:

function loop(start, test, update, body) {
  for (let value = start; test(value); value = update(value)) {
    body(value);
  }
}

loop(3, n => n > 0, n => n - 1, console.log);
// → 3
// → 2
// → 1

Ищете пошаговое руководство по изучению кода.Любая помощь, чтобы ясно понять эту проблему, была бы полезна.

Ответы [ 4 ]

0 голосов
/ 03 декабря 2018

Решить это с помощью цикла for кажется неловко, я понимаю, почему вы запутались, так же, как я - я тоже нуб :)

Вот рекурсивное решение, надеюсь, оно будет проливать больше света, если выне до конца разобрался:

function loop(value, test, update, execute) {
   if (!test(value)) return; // stop
   execute(value);
 return loop(update(value), test, update, execute);
}
0 голосов
/ 04 октября 2018

Пытаясь понять это сам, читая это ... но из того, что я понял из этого, звучит, как будто автор пытается научить вас одной из двух вещей.

  1. ЧтоЦикл for состоит из

    for (initialExpression; условие; incrementExpression) {и затем оператора}

  2. , в котором вы можете создать свою собственную настраиваемую настраиваемую функцию цикла, которая может функционировать как forEach () или как бы вы хотели, чтобы он функционировал.
0 голосов
/ 04 октября 2018
Цикл

A for состоит из 4 частей:

  • Инициализация - выполняется в начале цикла;обычно инициализирует переменную (и), используемую в частях Условие и Повторение.
  • Условие - выполняется перед каждой итерацией.Если его значение истинно, то тело выполняется;в противном случае цикл немедленно останавливается.
  • Повторение - это выполняется после каждого выполнения тела и обычно обновляет переменную, проверенную Условием.
  • Тело - Это просто обычный код, который выполняется каждый раз черезпетля.Обычно в нем используются переменные, обновляемые другими частями.

Синтаксис:

for (Initialization; Condition; Repetition) {
    Body
}

Итак, в вашем примере Initialization устанавливает текущее значение цикла(переменная value) к значению, которое было дано функции.

Условие затем выполняет функцию test(value).Цикл for автоматически проверит, возвращает ли он значение true или false - если он возвращает false, цикл останавливается.Это удовлетворяет требованию:

Каждая итерация сначала запускает тестовую функцию для текущего значения цикла и останавливается, если она возвращает false.

Затем выполняется тело, и выполняется body(value).Это реализует требование:

Затем он вызывает функцию body, присваивая ей текущее значение.

Затем Повтор выполняет value = update(value), что реализует:

Наконец, он вызывает функцию обновления для создания нового значения и запускается с начала.

0 голосов
/ 04 октября 2018

«Для циклов» - это встроенная функция, общая для языков программирования, включая JavaScript.Статья Википедии о них довольно полная, и я бы начал с нее, если бы вы хотели понять контекст вопроса.

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

В указанном вами решении определена функция («цикл»), которая принимает четыре параметра: начальныйзначение («начало»);функция, которая запускается перед каждой итерацией, чтобы проверить, должен ли цикл остановиться («test»);функция, которая будет запускаться после каждой итерации («обновление»);и функция, которая должна выполняться в теле цикла во время каждой итерации («тело»).Затем он использует фактический цикл for для выполнения запрошенных итераций.

...