在这个更高级别的函数中,参数n来自何处?

时间:2014-10-10 17:57:08

标签: javascript higher-order-functions

ch 5 of Eloquent Javascript的以下代码中,参数n的值来自何处?

为什么这个函数会返回任何。我想,我不想问一个非特定的,陈词滥调的问题,但我感到困惑:这个功能如何运作?



function unless(test, then) {
  if (!test) then();
}
function repeat(times, body) {
  for (var i = 0; i < times; i++) body(i);
}

repeat(3, function(n) {
  unless(n % 2, function() {
    console.log(n, "is even");
  });
});
// → 0 is even
// → 2 is even
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:6)

正如您所看到的,n被定义为回调中的参数:

repeat(3, function(n) {
//                 ^

让我们进入repeat函数:

function repeat(times, body) {
    for (var i = 0; i < times; i++) body(i);
    // We're calling our callback with i ^
}

此处times将为3body将成为我们的匿名函数(回调)。因此,当我们致电body(i)时,我们实际调用以下内容(使用n切换i,因为我们正在调用body(i)):

unless(i % 2, function() {
    console.log(i, "is even");
})

这是你的整个资料来源:

var times = 3;

for (var i = 0; i < times; i++) {
    var n = i; // We're renaming "i" (from body(i)) to "n" (in function(n))

    if (!(n % 2)) {
        console.log(n, "is even");
    }
}

答案 1 :(得分:0)

变量n在您传递给的回调方法中定义&#34;重复&#34;:

repeat(3,function(n){

除非在该回调函数内部进行了其他修改(或使用&#34; var n = ...&#34定义;该值将一直保留在范围内,一直到console.log调用。