Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не могу разобраться, как работает функция (https://javascript.ru/forum/misc/48134-ne-mogu-razobratsya-kak-rabotaet-funkciya.html)

Dionid 20.06.2014 23:55

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

jsnb 21.06.2014 04:04

Аргумент x передается при вызове equals, а аргумент element передается при вызове вложенной функции. В данном случае x (== 0) передается в 28 строке, а element будет передаваться в 19 строке (каждый элемент массива).

melky 21.06.2014 12:21

в equals находится замыкание. в нете есть куча статей по поводу замыканий, удачи :)

foo 21.06.2014 16:41

Цитата:

Сообщение от Dionid
Я не понимаю, как elements попадает внутрь функции и выходит булъиновое значение...

Вопрос поставлен не совсем корректно. Elements не попадает внутрь функции equals, это функция equals возвращает функцию, которая содержит в своем локальном скопе значение x. Затем уже эта возвращенная функция принимает аргумент.

MallSerg 21.06.2014 18:14

совсем на пальцах =)
<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.