我关注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
,它会打印值&#39; undefined
&#39;到控制台。我不明白为什么函数unless
不会访问其外部范围。有人可以解释原因吗?
答案 0 :(得分:4)
看这里
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')
});
答案 1 :(得分:1)
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/
答案 2 :(得分:1)
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
覆盖。