2016年10月,trincot在stackoverflow上发表了一篇关于使用reduce方法构建管道函数的优秀文章(链接),我正在尝试详细理解其中的代码。
ES6版本
function piper(...fs) {
return (...args) => fs.reduce((args,f) => [f.apply(this,args)],args)[0];
}
具体来说:
1. 与其使用 [f.apply(this.args)]
,f(...args)
也可以工作,但 f(args)
不起作用。为什么 f(args)
不起作用?
2. 关于内部(匿名)“reduce”函数中的第二个参数,为什么需要 args
?即为什么以下代码不起作用?
function piper(...fs) {
return (...args) => fs.reduce((args,f) => [f.apply(this,args)])[0];
}
B. 或者,为什么我们不能只使用
[]
作为参数,而不是args
?function piper(...fs) {
return (...args) => fs.reduce((args,f) => [f.apply(this,args)],[])[0];
}
ES5版本
function piper(/* functions */) {
var fs = [].slice.apply(arguments);
return function (/* arguments */) {
return fs.reduce(function (args,f) {
return [f.apply(this,args)];
}.bind(this), [].slice.apply(arguments))[0];
}.bind(this);
}
问题: 1. 在内部(匿名)
reduce
函数中,为什么我们需要第二个参数[].slice.apply(arguments)
?即,为什么不能使用[]
代替它?
2. 或者,为什么我们不能完全省略该参数?非常感谢你帮助我更深入地理解这些问题。
0
也是合适的,这样一个空数组在调用reduce()
时就不会抛出异常。 - Patrick Roberts