2013-08-27 2 views
2

Я полагаю, что это вопрос новичков, но я не могу понять это. У меня есть этот код, с красноречивым JavaScript, о функции уменьшения:Newb: Почему эта переменная сохраняется вместо сброса?

function forEach (info, func) { 
    for (i = 0; i < info.length; i++) { 
     func(info[i]); 
    } 
} 

function reduce (combine, base, array) { 
    forEach(array, function(elem) { 
     base = combine(base, elem); 
     console.log("The base is: " + base); 
    }); 
    return base; 
} 

function countZeroes(array) { 
    function counter(total, element) { 
    console.log("The total is: " + total); 
    return total + (element === 0 ? 1 : 0); 

    } 
    return reduce(counter, 0, array); 
} 

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

+0

Не могли бы вы прояснить вопрос. Что вы ожидаете, каждый раз «уничтожается»? – seanmcl

+0

Существующее значение передается функции ('counter') через параметр' total', а функция * добавляет * к существующему счетчику: 'total + (element === 0? 1: 0)'. –

+2

Похоже, Марцин прибил его. Но предупреждение: ваш 'i' в' forEach' просачивается в глобальную область, вы должны использовать 'for (var i = 0; ...'. – bfavaretto

ответ

2

Структура reduce является то, что он применяет функцию f которая принимает два операнда - здесь называют element и total к последовательности. element - следующий необработанный элемент в последовательности (массив); total является результатом предыдущего вызова f.

концептуально reduce(f, 0, [1,2,3]) расширился до f(3,f(2,f(1,0).

Теперь, чтобы ответить на ваш вопрос: бегущая total сохраняется между сеансами counter в переменной basereduce внутри.

+0

Спасибо большое, ребята, я ценю вашу помощь! – wsnader80

+0

@ wsnader80 Добро пожаловать. Не стесняйтесь проголосовать и принять этот ответ. – Marcin

Смежные вопросы