"Интересно, почему эта строка: возвращать acc + cur.length; автоматически устанавливает новое значение acc без необходимости сохранять его в новом константе."
You 'повторная передача функции обратного вызова на .reduce()
.Метод .reduce()
внутренне вызывает предоставленную вами функцию и сохраняет ее возвращаемое значение.
Эти вызовы происходят в цикле, поэтому вызов обратного вызова в следующей итерации цикла получает значение, которое вы вернули из предыдущей итерации.
Вот очень упрощенная версия .reduce
метода.
Array.prototype.myReduce = function(callback, acc) {
var i = 0;
if (arguments.length < 2) {
acc = this[0];
i = 1;
}
while (i < this.length) {
// The provided callback gets invoked with the current
// value of `acc`, and then overwrites `acc` with the
// return value so that the next iteration gets passed
// that new value.
acc = callback(acc, this[i], i, this);
i++;
}
return acc;
};