/**
* NOTE: 實現(xiàn)函數(shù)curry超歌,該函數(shù)接受一個多元(多個參數(shù))的函數(shù)作為參數(shù)常熙,然后一個新的函數(shù),
這個函數(shù) 可以一次執(zhí)行焕盟,也可以分多次執(zhí)行桃焕。
*/
/**
* NOTE: curry 的意義在于能夠在不完全指定函數(shù)參數(shù)的情況下運行函數(shù)寸宏,
實際意義呢幕袱? 其實curry需要和compose等配合來有效果仪际,比如 配合寫出{ pointfree: 不使用所要處理的值,只合成運算過程 }的代碼宪迟。
*/
function curry(fn) {
const ctx = this;
function inner(...args) {
// fn.lenght === fn args length
if (args.length === fn.length) {
return fn.call(ctx, ...args);
}
return (...innerArgs) => inner.call(ctx, ...args, ...innerArgs);
}
return inner;
}
// test
function test(a, b, c) {
console.log(a, b, c);
}
const f1 = curry(test)(1);
const f2 = f1(2);
console.log(f2(3))
/**
* NOTE: 寫一個函數(shù)酣衷,實現(xiàn)Function.prototype.bind的功能。
*/
Function.prototype.myBind = function (ctx, ...args) {
return (...innerArgs) => this.call(ctx, ...args, ...innerArgs);
}
// test
const a = {
name: "name of a"
};
function test(...msg) {
console.log(this.name);
console.log(...msg);
}
const t = test.myBind(a, "hello");
t("world");