2014-10-06 2 views
0

мне нужна помощь разрушения построчно, что происходит в этом примере (отрывок из красноречивых Javascript):функции порядка объяснение High при передаче функции другой функции

Мы имеем функцию Foreach которая регистрирует каждый элемент в массив. Я понимаю, как это работает.

function forEach(array, action) { 
    for (var i = 0; i < array.length; i++) 
    action(array[i]); 
} 

Таким образом, мы имеем массив с именем «числа» и другую переменную с именем «сумма» устанавливается в 0. Где я заблудиться, когда «функция (номер)» получает передается в параметр действия. Что это делает и как это работает? Я не понимаю, какая это ценность. Может кто-то сломать это?

var numbers = [1, 2, 3, 4, 5], sum = 0; 
forEach(numbers, function(number) { 
    sum += number; 
}); 

console.log(sum); 
// → 15 
+1

«Я понимаю, как это работает» - похоже, вы не знаете. –

+0

Это [* выражение функции *] (http://stackoverflow.com/q/1013385/1048572), создавая [* замыкание *] (http://stackoverflow.com/q/111102/1048572) над 'sum '. – Bergi

+0

Спасибо! Разум объясняет? –

ответ

0

Я думаю, вы не понимаете синтаксическую структуру вызова. Можно также написать

var numbers = [1, 2, 3, 4, 5]; 
var sum = 0; 
function addToSum(number) { 
    sum += number; 
} 

forEach(numbers, addToSum); 

Надеюсь, что здесь ясно. У нас есть функция addToSum и передать эту функцию функции forEach, где мы ссылаемся на нее по ее имени параметра action и будем вызывать ее с каждым элементом переданного массива в теле цикла: action(array[i]). Большая часть этой абстракции заключается в том, что мы можем передать любую произвольную функцию в forEach ...

Итак, что же это за странный синтаксис? Во-первых, он заменяет function declaration by a function expression. Выражение функции - это просто выражение, которое оценивает объект функции, точно так же, как литерал массива [1, 2, 3, 4, 5] оценивает объект массива. Его также называют анонимной функцией , так как у нее нет имени. Мы принимаем это значение и присваиваем его переменной:

var numbers = [1, 2, 3, 4, 5]; 
var sum = 0; 
var addTosum = function(number) { 
    sum += number; 
} 

forEach(numbers, addToSum); 

Ничто так не изменилось, пока здесь. Теперь зачем нужна эта переменная? Нам не нужны эти идентификаторы, указывающие на значения, которые мы создали с помощью выражений. Теперь мы просто положить выражения непосредственно в вызове функции forEach - по-прежнему проходит одни и те же значения (forEach не заметить разницу):

var sum = 0; 

forEach([1, 2, 3, 4, 5], function(number) { 
    sum += number; 
}); 
+0

PERFECT !!!!!!!!!!!!!!! –

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