将变量传递给高阶函数

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 没有访问其外部范围的权限。有人可以解释一下原因吗?

nundefined 因为调用函数 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')
    });
});
  1. 不需要 里面 n 因为你把它当作 closure
  2. 由于您正在调用 then() 没有 任何参数 - n 未定义。
  3. 外部 n 被内部范围 n 覆盖。