2015-11-22 101 views
2

當前我正在閱讀JavaScript書。有一個代碼片段,我不明白。發生什麼事repeat(3, function(n) {?爲什麼我們可以將參數n傳遞給函數repeat的第二個參數,因爲在它的聲明中沒有關於傳遞參數的內容? repeat如何理解它應該將參數n傳遞給unless函數?JavaScript函數中的參數處理

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 

回答

2

爲什麼我們能夠參數n傳遞給函數的重複的第二個參數,因爲在它的聲明沒有任何有關將參數

您是傳遞n作爲第二個參數來repeat() ,您傳遞的參數爲anonymous function,其中採用單個參數,並且您選擇了其參數參數n(因此傳入的功能的參數)

簡而言之,JavaScript中的函數只是可以執行的對象。這意味着你可以作爲參數來回傳遞功能等功能,或者像你想對對象屬性添加到他們,等

這裏是在您的例子發生的說明:

功能repeat與定義兩個參數:

repeat(times, body) 

所以,你正在做的是傳遞function作爲body參數。 寫它像這相當於:

var times = 3; 
var body = function(n) { 
    unless(n % 2, function() { 
     console.log(n, "is even"); 
    }); 
}; 

repeat(time, body); 

如何重複明白,它應該通過參數n的,除非功能?

正如你在上面看到的,repeat沒有傳遞任何東西到unless()。 這是你的匿名函數(存儲在body上面的例子中),實際上是通過nunless

2

根本沒有傳遞參數n

實際上,您將一個完整的匿名函數作爲參數傳遞(函數是JavaScript中的一等公民,可以像其他變量一樣傳遞)。

如果你看,該函數作爲body參數傳遞給方法repeatrepeat然後調用函數body,參數爲i ...這是參數n在匿名函數中。

0

如果你只是想編寫一個函數來重複x次,並檢查它甚至,你可能想要做這樣的:

function repeat(times) { 
 
    for (var i = 0; i < times; i++) { 
 
     output.innerHTML+= is_even(i)+"\n"; 
 
    } 
 
} 
 
function is_even(n) { 
 
    if (n % 2) return n+" is even"; 
 
    return n+" is odd"; 
 
} 
 
var output = document.getElementById('output'); 
 
repeat(6); // Output variable wasn't passed to this function, we're using it globally
<pre id='output'></pre>