将变量传递给高阶函数
Passing variables into higher order functions
我正在关注 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
没有访问其外部范围的权限。有人可以解释一下原因吗?
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/
看这里
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
覆盖。
我正在关注 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
没有访问其外部范围的权限。有人可以解释一下原因吗?
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/
看这里
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
覆盖。