科裏化函數
概念: 只傳遞給函數一部分參數來調用它,讓它返回一個函數去處理剩下的參數。ui
var add = function(x) { return function(y) { return x + y; }; }; var increment = add(1); var addTen = add(10); increment(2); addTen(2);
只定義了一個 add 函數,他接受一個參數並返回一個新的函數,調用 add 以後,返回的函數就經過必報的方式記住了 add 的第一個參數。一次性地調用它是在是有點繁瑣,好在咱們能夠使用一個特殊的curry幫助函數使這類函數的定義和調用更加容易。code
var curry = require('lodash').curry; var match = curry(function(what,str){ return str.match(what); }); var replace = curry(function(what, replacement, str){ return str.replace(what, replacement); }); var filter = curry(function(f, ary) { return ary.filter(f); }); var map = curry(function(f, ary) { return ary.map(f); });
我在上面的代碼中遵循的是一種簡單,同時也很是重要的模式。即策略性地把要操做的數據(string, Array)放到最後一個參數裏。到使用它們的時候就明白這麼作的緣由是什麼了。rem
match(/\s+/g, "hello world"); // [ ' ' ] match(/\s+/g)("hello world"); // [ ' ' ] var hasSpaces = match (/\s + /g); // function(x) { return x.match(/\s+/g) } hasSpaces("hello World"); // [ ' ']