2014-05-08 45 views
1

我是功能編程的新手,並試圖通過對一些關鍵的Underscore函數進行反向工程來收集知識。由於_.each是基礎性的,我可以從那裏開始。這裏是我的相比下來(爲簡單起見)版本沒有錯誤檢查,語境結合,和一堆其他下劃線迷死:瞭解下劃線的_each

var myEach = function(collection, iterator) { 
    if (collection instanceof Array) { 
     for (var i = 0; i < collection.length; i++) { 
     iterator(collection[i], i, collection); 
     } 
    } else { 
     for (var key in collection) { 
     iterator(collection[key], key, collection); 
     } 
    } 
    }; 

一般性意見是值得歡迎的,但我的問題特別是圍繞這些(collection[i], i, collection)參數傳遞給iterator

這是怎麼回事?這些參數在使用過程中如何變得可選?

很確定它與對象有關,但我真的很想知道幕後發生了什麼。

謝謝!

回答

2

在JavaScript中,函數的調用者決定它將傳遞它正在調用的函數的參數。

被調用的函數可以決定使用哪些參數或不使用哪些參數。所以,迭代器回調可以被聲明,但是它是想要的。第一個參數是被迭代的項目,第二個參數是集合中的索引,第三個參數是集合本身。

如果僅使用第一個參數聲明回調,那麼這並不重要。所有三個參數都存在,無論回調是否聲明它們,如果它們未在函數聲明中聲明,則它們都不能通過命名參數進行訪問,但它們都在arguments對象中。


也許這給了你一些想法:

function callMe(callback) { 
    callback(1, 2, 3); 
} 

callme(function(a) { 
    // a === 1 
}) 

callme(function() { 
    // all the arguments are still there 
    // even though none are declared 
    // arguments[0] === 1 
    // arguments[1] === 2 
    // arguments[2] === 3 
}); 

callme(function(a, b, c) { 
    // a === 1 
    // b === 2 
    // c === 3 
}) 

callme(function(a, b, c, d) { 
    // a === 1 
    // b === 2 
    // c === 3 
    // d === undefined 
})