const curry = (fn) => (...args)=>fn.bind(null,...args);
const split = curry((spliton, str) =>str.split(spliton));
console.log(split(" ")("hello js")); // ["hello","js"]
這個函式初看一頭霧水,split()()被連續呼叫,但是兩個引數是怎麼傳遞的,fn.bind(null,...args)不僅繫結了this,還能傳遞引數?,查了一下mdn
bind()方法會建立乙個新函式。當這個新函式被呼叫時,bind()的第乙個引數將作為它執行時的 this, 之後的一串行引數將會在傳遞的實參前傳入作為它的引數。前半句好理解,相信大家也也用到過,為函式繫結執行時的this
var name = "out value"
const obj =
};let f1 = obj.fn.bind(obj);
let f2 = obj.fn
f1() // test bind
f2() // out value
後半句,多餘的引數將會當成新函式被呼叫時的引數,看例子
function test(one,two)
var tmp = test.bind(null,111);
tmp(2222); // 111 222
111被當成了函式的第乙個引數
回頭看,這個函式寫的很簡潔 ,平時實現相同的方法,大概會這麼寫
function curry(fn)
}}
es6 寫法
const curry = (fn) => (...agrs) => (str) => fn(...agrs,str)
const split = curry((spliton, str) =>str.split(spliton));
console.log(split(" ")("hello js"))
總的來看區別不大,只是**看起來更乾淨一點 引數繫結bind
bind可以看作乙個函式介面卡,接受乙個可呼叫物件生成乙個新的可呼叫物件來適應原物件的引數列表。形式 auto newcallable bind callable,arg list newcallable本身是乙個可呼叫物件,arg list是乙個逗號隔開的引數列表,對應callable中的引數。當...
10 3 4引數繫結 bind
count if演算法,類似find if,此函式接受一對迭代器,表示乙個輸入範圍,還接受乙個謂詞,會對輸入範圍中的每個元素執行。count if返回乙個計數值,表示謂詞有多少次為真。使用bind函式必須包含標頭檔案functional且必須包含命名空間placeholders,該命名空間也包含於f...
10 3 4引數繫結 bind
count if演算法,類似find if,此函式接受一對迭代器,表示乙個輸入範圍,還接受乙個謂詞,會對輸入範圍中的每個元素執行。count if返回乙個計數值,表示謂詞有多少次為真。使用bind函式必須包含標頭檔案functional且必須包含命名空間placeholders,該命名空間也包含於f...