在执行lodash里面的 .flowRight()方法 里调用.curry()的方法时 对入参顺序感觉奇怪
const split = _.curry((sep, str) => _.split(str, sep))
//省略其他方法 只针对split
const f = _.flowRight(join('-'), trace('map 之后'), map(_.toLower), trace('split 之后'), split(' '))
1.对这个执行顺序感觉奇怪 调用_.curry方法 影响到了执行 sep和str的顺序会影响到结果,
const split = _.curry((sep, str) => _.split(str, sep))
2.于是通过相传的_.curry 逻辑将输出放入cuury方法中
curry对入参的执行顺序 是按顺序取入参 直到方法接收完全不入参
function curry (func) {
return function curriedFn(...args) {
console.log(args);
console.log("curriedFn");
// 判断实参和形参的个数
if (args.length < func.length) {
return function () {
return curriedFn(...args.concat(Array.from(arguments)))
}
}
return func(...args)
}
}
const split1 = curry((sep, str) => {
console.log("stris " +str);
return _.split(str, sep)
})
const f = _.flowRight( split1(' '))
console.log(f('NEVER SAY DIE'))
3.执行顺序如下
是否表明flowRight的执行顺序是先取了方法里的参数 最后调用f的参数
[ ’ ’ ]
curriedFn
[ ’ ', ‘NEVER SAY DIE’ ]
/curriedFn
4.再次用简单的多数相加方法证明
const add1 = curry((a,b,c) => {
return a+b+c
})
const f2 = _.flowRight( add1("2","3"))
console.log(f2("1"))
5.执行顺序果然如下
[ ‘2’, ‘3’ ]
curriedFn
[ ‘2’, ‘3’, ‘1’ ]
curriedFn
所以认为f2(“1”)可以视为_.flowRight( add1(“2”,“3”)(“1”))
即最后调用的总在后面
所以 const split = _.curry((sep, str) => _.split(str, sep)) 当确定了分隔符号的时候 str确实应该放在后面
const f3 = _.flowRight( add1("3"))
console.log(f3("1","2"))
同理可得
[ ‘3’ ]
curriedFn
[ ‘3’, ‘1’, ‘2’ ]
curriedFn