1. 將函數做爲參數;
複製代碼
<!--repeatedly值版本-->
function repeatedly(times,value){
return _.map(_.range(times),()=>{ return value })
}
<!--repeatedly 函數版本-->
function repeatedly(times,fun){
return _.map(_.range(times),fun)
}
repeatedly(3,function(){
return Math.floor(Math.random()*10+1)
})
複製代碼
repeatedly是函數式編程的一個典型思惟,將值變成函數。java
2. 返回其餘函數的函數。
複製代碼
react和redux裏面用了大量的返回其餘函數的函數。包括高階組件,applyMiddleware函數。 Thunk函數也是一個返回其餘函數的函數。react
var Thunk = function(fn){
return function(){
var args = Array.prototype.slice.call(arguments);
return function(callback){
args.push(callback);
return fn.apply.(this,args);
}
}
}
var readFileThunk = Thunk(fs.readFile);
readFileThunk(fileA)(callback);
複製代碼
function existy(x) {
return x != null;
}
function doWhen(cond, action) {
if (tructhy(cond))
return action();
else
return undefined;
}
function invoker(NAME, METHOD) {
return function (target) {
if (!existy(target)) {
alert('Must provide a target');
}
var targetMethod = target[NAME];
var args = _.rest(arguments);
return doWhen(existy(targetMethod) && METHOD === targetMethod, function () {
return targetMethod.apply(target, args);
});
}
}
function dispatch() {
var funs = _.toArray(arguments);
var size = funs.length;
return function (target) {
var ret = undefined;
var args = _.rest(arguments);
for (var funIndex = 0; funIndex < size; funIndex++) {
var fun = funs[funIndex];
ret = fun.apply(fun,construct(target,args))
if(existy(ret)) return ret;
}
if(existy(ret)) return ret;
}
}
var str = dispatch(invoker('toString',Array.prototype.toString),invoker('toString',String.prototype.toString));
console.log(str('a'));
console.log(str(_.range(10)));
複製代碼
dispatch將多個invoker組合在一塊兒,造成多態函數,或根據不一樣的參數產生不一樣行爲的參數。 2. 柯里化。 對於每一個邏輯參數,柯里化函數會逐漸返回已配置好的函數,直到全部的參數用完。編程
function curry(fun){
return function(firstArg){
retun function(secondArg){
return fun(firstArg,secondArg);
}
}
}
複製代碼
function partApply(f, x) {
return function(y) {
return f(x, y);
}
}
複製代碼
_.compose函數從右往左執行。也就是說,最右邊的函數的結果會被送入其左側的函數,一個接一個。redux
function not(x){
return !x;
}
var isntString = _.compose(not,_isString);
複製代碼
function touchAndLog(touchFn) {
let data = { key: 'value' };
touchFn(data);
console.log(data.key); // 猜猜會打印什麼?
}
複製代碼
在不查看 touchFn 的代碼的狀況下,由於不肯定它對 data 作了什麼,你是不可能知道會打印什麼(這不是廢話嗎)。但若是 data 是 Immutable 的呢,你能夠很確定的知道打印的是 value。bash
function LazyChain(obj){
this._calls = [];
this._target = obj;
}
LazyChain.prototype.invoke = function(methodName){
var args = _.rest(arguments);
this._calls.push(function(target){
var meth = target[methodName];
return meth.apply(target,args);
})
return this;
}
LazyChain.prototype.force = ()=>{
return _.reduce(this._calls,function(target,thunk){
return thunk(target);
},this._target)
}
new LazyChain([1,2,3]).invoke('sort').force();
複製代碼