将变量传递给更高阶的函数

时间:2015-07-05 10:45:13

标签: javascript function scope 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,它会打印值&#39; undefined&#39;到控制台。我不明白为什么函数unless不会访问其外部范围。有人可以解释原因吗?

3 个答案:

答案 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)

nundefined,因为函数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')
    });
});
  1. 需要n,因为您将其作为closure
  2. 由于您在没有任何参数的情况下调用then() - n未定义。
  3. 外部n被内部范围n覆盖。