2015-12-22 40 views
2

與下面的模擬代碼(_涉及lodash庫):傳遞額外參數的函數調用(lodash)

var containerFunction = function() { 
    var opts = {data: value}; 
    _.map(lines, functionForEach); 
} 

var functionForEach = function (line) { 
    Do something for each line passed in from the maps function. 
    Need to access opts in this scope. 
    return value; 
} 

的論點線從map函數收到,但什麼是最好的將opts參數傳遞給functionForEach函數的方法,同時保持上面的粗略模式(如果可能)。

我想是這樣的:

_.map(lines, functionForEach(opts)) 

或類似可能的工作的東西,但顯然不會。

有什麼建議嗎?

+0

將'functionForEach'放入'containerFunction'中。如果您必須將'opts'作爲第三個'context'('thisArg')參數傳遞給'_.map',並在'functionForEach'內部使用'this'來訪問它。 –

+0

我不想嵌套這個函數,因爲我從性能和內存的角度看到了它所皺起的印象。 – Seonixx

+1

你從哪裏得到這樣的印象?即使是這種情況,事實並非如此,首要任務應該是讓代碼乾淨利落,然後擔心性能。 –

回答

5

你有三個選擇:

  1. functionForEachcontainerFunction。如果你不打算在其他地方使用functionForEach,這是最有意義的。

  2. 把它寫成:

    var containerFunction = function() { 
        var opts = {data: value}; 
        _.map(lines, function(elt) { return functionForEach(elt, opts); }); 
    } 
    
    var functionForEach = function (line, opts) { 
        Do something for each line passed in from the maps function. 
        Need to access opts in this scope. 
        return value; 
    } 
    
  • 如果必須,通過opts作爲第三(thisArg)參數來_.map和訪問它使用this裏面的functionForEachvar
  • +0

    閉包。當然!謝謝 :) – Seonixx

    3

    看看_.partial。文檔:

    partial

    var containerFunction = function() { 
        var opts = { data: value }; 
        _.map(lines, _.partial(functionForEach, opts)); 
    }; 
    
    var functionForEach = function (opts, line) { ... }; 
    

    _.partial返回與前置到functionForEach的參數的新功能。在上面的例子中,_.partial返回以下函數簽名:

    function (line) { ... } 
    

    調用帶有線返回功能與行調用functionForEach並選擇採用默認,無論你在傳遞中_.partial參數。

    4

    Lodash具有良好的函數組合功能,包括部分應用參數。但是,這實際上並不那麼簡單。假設我們想要使用partialRight()

    function functionForEach(item, i) { return item * i; } 
    
    _.map([1, 2, 3], _.partialRight(functionForEach, 2)); 
    // → [0, 2, 6] 
    

    糟糕。這是不正確的。原因是我們沒有得到像我們預期的那樣傳遞給functionForEach()的參數。我們希望i參數的值始終爲2,而item是映射的集合值。

    讓我們嘗試別的東西:

    _.map([1, 2, 3], _.ary(_.partialRight(functionForEach, 2), 1)); 
    // → [2, 4, 6] 
    

    這是更好的。問題是map()將第一個參數以及其他兩個參數(索引和集合本身)作爲參數傳遞。既然我們不關心後面這兩個參數,我們可以使用ary()來組合一個忽略它們的新函數。

    這裏的另一種方法:

    _.map([1, 2, 3], _.partial(_.rearg(functionForEach, 1, 0), 2)); 
    // → [2, 4, 6] 
    

    這一次,我們使用rearg()改變我們的partial()函數參數的順序。我發現這種方法比簡單的partialRight()更不直觀。

    最後一個例子:

    _.map([1, 2, 3], _.flow(_.identity, _.partialRight(functionForEach, 2))); 
    // → [2, 4, 6] 
    

    在這裏,我們使用flow()高階函數組成我們的回調。此函數接受提供給它的參數,並將我們傳遞給它的函數鏈接在一起 - 最後一個函數的輸出是下一個函數的輸入。我們在這裏使用identity()函數,因爲它只是返回傳遞給它的第一個參數,這正是我們想要的。

    最後一種方法類似於ary()方法 - 它做同樣的事情。如果我們想通過在functionForEach()之前或之後傳遞更多的函數來構建這種行爲,那麼flow()方法會更好。