Не могу разобраться, как работает функция
Доброго времени суток.
Вот функция, которую нашел в одном учебнике. Сразу задам вопрос: Как работает функция equals? Думаю, весь код не нужно читать, нужны предпоследняя и предпредпоследние функции: function forEach(array, action) { "use strict"; var i = 0; for (i = 0; i < array.length; i += 1) { action(array[i]); } } function reduce(combine, base, array) { "use strict"; forEach(array, function (e) { base = combine(base, e); }); return base; } function count(test, array) { return reduce(function(total, element) { return total + (test(element) ? 1 : 0); }, 0, array); } function equals(x) { return function(element) {return x === element;}; } function countZeroes(array) { return count(equals(0), array); } Я не понимаю, как elements попадает внутрь функции и выходит булъиновое значение... Ведь по-идее любое число в equals становится переменной X, а как тогда они производят сразвнение с elements, которое вообще определяется в функциях на уровни выше? |
Аргумент x передается при вызове equals, а аргумент element передается при вызове вложенной функции. В данном случае x (== 0) передается в 28 строке, а element будет передаваться в 19 строке (каждый элемент массива).
|
в equals находится замыкание. в нете есть куча статей по поводу замыканий, удачи :)
|
Цитата:
|
совсем на пальцах =)
<script> function eguals (x) { return function(element) {return x === element;} } /* значение возвращает функция eguals а не анонимная функция "function(element)" eguals возвращает анонимную функцию*/ alert ("1. = " + eguals ( window ) ) ; /* первая часть "eguals (a)" вернет функцию переменная "x" останется в замыкании и будет доступна внутри функции eguals т.е. анонимной функции которая возвращается с помощью return вторая часть "(b)" это код вызывает анонимную функцию которую вернула первая часть */ var a = window; var b = document; var c = this; alert ("2. = " + ( eguals (a)(b) )); alert ("3. = " + ( eguals (a)(c) )); alert ("4. = " + ( eguals (a)(a) )); </script> |
Часовой пояс GMT +3, время: 11:51. |