Передача переменных в функции высшего порядка
Я подписан на 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')
});
});
- Вам не нужно
n
внутри, так как у вас есть какclosure
, - Так как вы вызываете
then()
без каких-либо параметров -n
не определено - Внешний
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/