2014-10-10 27 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將是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"); 
    } 
} 
+0

問題。對於i = 1,n%2 = 1。在「除非」函數的「測試」部分中,它是否轉換爲「真」? – Goodword 2014-10-10 18:06:49

+1

@Goodword它沒有,但JavaScript有一個很大範圍的東西,它認爲[truthy或falsy](http://dorey.github.io/JavaScript-Equality-Table/)。正如你從這張表中看到的,'0'是虛假的,因此匹配'if(!test)'。 'if(foo)'與'if(foo == true)'相同。爲了證明我們可以迭代的邏輯並自己計算這些方程:'0%2 = 0'(falsy - show),'1%2 = 1'(truthy--不顯示),'2%2 = 0' (falsy -show)。 – h2ooooooo 2014-10-10 18:11:05

0

變量n在您傳遞給「重複」的回調方法中定義:

repeat(3,function(n){ 

除非在該回調函數內部進行了其他修改(或者使用「var n = ...」定義該值將一直保留在範圍內,直到console.log調用。

相關問題