2014-10-10 2 views
2

В следующем коде от ch 5 of Eloquent Javascript, откуда взялось это значение аргумента n?в этой функции более высокого уровня, откуда взялся аргумент, 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

ответ

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 будет 3 и body будет нашей анонимной функцией (обратный вызов). Поэтому, когда мы называем 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"); 
    } 
} 
+0

Вопрос. для i = 1, n% 2 = 1. Преобразует ли это 1 в «истинное» в «тестовую» часть функции «если»? – Goodword

+1

@Goodword Это не так, но javascript имеет огромный диапазон вещей, которые он считает [правдивым или фальшивым] (http://dorey.github.io/JavaScript-Equality-Table/). Как видно из этой таблицы, '0' является ложным и, следовательно, соответствует' if (! Test) '. 'if (foo)' совпадает с 'if (foo == true)'. Чтобы доказать логику, мы можем выполнить итерацию и вычислить сами уравнения: '0% 2 = 0' (falsy-show),' 1% 2 = 1' (правка - не показывать), '2% 2 = 0' (falsy-show). – h2ooooooo

0

Переменная n определяется в методе обратного вызова, который вы переходите к «повторению»:

repeat(3,function(n){ 

, если иное не изменено внутри этой функции обратного вызова (или определено с помощью «var n = ...», это значение будет сохраняться в области вплоть до вызова console.log.

Смежные вопросы