Не могу разобраться, как работает функция
Доброго времени суток.
Вот функция, которую нашел в одном учебнике. Сразу задам вопрос: Как работает функция 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, время: 01:33. |