Передача переменных в функции высшего порядка

Я подписан на http://eloquentjavascript.net/05_higher_order.html. У меня есть следующий кусок кода

function findEven(number, body) {
    for(var i = 0; i < number; i++) body(i)
}

function unless(test, then) {
    if(!test) then();
}

findEven(10, function (n) {

    unless(n%2, function (n) {

        console.log(n, 'is even')

    });


});

Мой вопрос, если я передам переменную n в функцию unless он печатает значениеundefinedк консоли. Я не понимаю, почему функция unless не скрывает доступ к своей внешней области видимости. Может ли кто-нибудь объяснить причину?

3 ответа

Решение

Смотри сюда

function unless(test, then) {
    if(!test) then();
}

И здесь

unless(n%2, function (n) {

    console.log(n, 'is even')

});

unless функция не передает ничего в тот обратный вызов, который принимает n, поэтому n не определено.

вероятно, просто удалите n от обратного вызова, так что это

unless(n%2, function () {

    console.log(n, 'is even')

});
findEven(10, function (n) {
    // remove n as an input param
    unless(n%2, function () {
        console.log(n, 'is even')
    });
});
  1. Вам не нужно n внутри, так как у вас есть как closure,
  2. Так как вы вызываете then() без каких-либо параметров - n не определено
  3. Внешний n переопределяется с внутренней областью n,

n является undefined потому что функция then() вызывается без каких-либо аргументов. Проблема заключается в том, что вы определяете функцию, переданную в unless, Аргумент n переопределяет переменную n уже определено в закрытии. Поэтому, потому что then() вызывается без аргументов, n принимает значение undefined и консоль печатает undefined,

Чтобы исправить ошибку, просто удалите n из аргументов:

unless(n%2, function () {
        console.log(n, 'is even')

    });

JSFiddle: https://jsfiddle.net/5tvafuqt/

Другие вопросы по тегам