2017-08-24 30 views
-3

這是來自「機鋒的JavaScript」一書爲例(我想你知道這本書):JavaScript中的一個函數如何以不同的方式被「定義」兩次?

function groupBy(array, groupOf) { 
    var groups = {}; 
    array.forEach(function(element) { 
    var groupName = groupOf(element); 
    if (groupName in groups) 
     groups[groupName].push(element); 
    else 
     groups[groupName] = [element]; 
    }); 
    return groups; 
} 

var byCentury = groupBy(ancestry, function(person) { 
    return Math.ceil(person.died/100); 
}); 

的代碼做什麼並不是很重要。

問題是:groupBy函數有兩個不同的'body',即它完全不同的東西,據我所知。在第一個例子中,它做了很多邏輯,但是第二次,它第一次有不同的第二個參數(function(person)而不是groupOf,第二,它只是分割一個數組元素屬性(這是死亡日期由100

一個人在39人)數組怎麼會這樣,同樣的功能也不同的東西?我不明白,
相同功能的這兩種情況下莫名其妙地合作,但究竟是一般的原則這種合作的?

謝謝!

+4

函數聲明與函數調用混淆在一起。第一個是定義該功能的功能。第二次用參數 – abhishekkannojia

+2

調用它第二次調用函數並傳遞一個函數作爲第二個參數。 –

+0

你現在應該做的一件事是學習如何使用JavaScript調試器。如果你在代碼的最上面放置了一個'debugger;'語句,你可以在開發工具打開的任何瀏覽器中加載它。它將停止在'debugger;'語句中。然後點擊Step In按鈕,看看會發生什麼。在查看當前狀態並理解它之後,請繼續單擊「步入」。每次點擊它時,它都會跳到下一個要執行的語句。那麼你很快就會明白髮生了什麼。這是一個[Chrome DevTools指南](https://developer.chrome.com/devtools)。 –

回答

1

下面的代碼是不是「重新定義」 groupBy。這只不過是調用它:

var byCentury = groupBy(ancestry, function(person) { 
    return Math.ceil(person.died/100); 
}); 

groupBy函數接收回調函數作爲第二個參數(groupOf)。你在那裏傳遞一個匿名函數,它返回Math.ceil(person.died/100);

-1

第一個

function groupBy(array, groupOf) {} 

函數聲明其中函數的名稱爲GROUPBY並且它是全局accessable

而第二個

var byCentury = groupBy(ancestry, function(person) {}); 

funcion呼叫。這裏的返回值由Cntury分配給一個變量。

可能會因爲function(person) {}而感到困惑。 請注意,在JavaScript中,我們有頭等函數這意味着函數被視爲與任何其他變量一樣。因此函數作爲參數傳遞給函數組ByBy

+1

不,第二次出現'groupBy'就是*調用函數。 –

+0

感謝您指出。我編輯了我的答案 –

相關問題