2016年10月,从trincot发表了一篇精彩的文章,内容涉及使用reduce方法(link to posting)构造管道函数,我正在尝试详细了解代码。
ES6版
@media only screen and (max-width: 960px) {
.wyomingx,
.coloradox,
.mainex,
.dc2x,
.nyx,
.signsx {
opacity: 0;
}
}
具体地:
1. function piper(...fs) {
return (...args) => fs.reduce((args,f) => [f.apply(this,args)],args)[0];
}
也可以代替[f.apply(this.args)]
,但是f(...args)
不起作用。 f(args)
为什么不起作用?
2.关于内部(匿名)“ reduce”函数中的第二个参数,为什么f(args)
甚至是必要的? 。 。 。,即以下代码为何不起作用?
args
B。另外,为什么我们不能仅使用function piper(...fs) {
return (...args) => fs.reduce((args,f) => [f.apply(this,args)])[0];
}
而不是[]
作为参数?
args
ES5版本
function piper(...fs) {
return (...args) => fs.reduce((args,f) => [f.apply(this,args)],[])[0];
}
问题:
1.在内部(匿名)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);
}
功能,为什么还需要第二个参数reduce
?即为什么[].slice.apply(arguments)
不能代替它?
2.另外,我们为什么不能只是省去了参数完全?
在此先感谢您帮助我更深入地了解这些问题。
答案 0 :(得分:1)
作为第二个参数传递给var data = 0
const sheets = google.sheets({version: 'v4', auth})
console.log("start search")
sheets.spreadsheets.values.get(request, function(err, response) {
if (err) {}
var data = search(response, string)
console.log("search complete")
});
console.log("data return point")
return data;
函数的start search
data return point
search complete
需要指定累加器的初始值(即args
变量),因此在第一次迭代中,
reduce
将args
作为初始参数(如预期)。否则,在不将初始值传递给fs.reduce((args,f) =>
的情况下,args
的初始值将 .reduce
数组中的第一项,这肯定不是你想要的:
args
此外,像这样,fns
数组中的第一个函数根本不会被调用。
通常,仅当累加器的类型与要在上迭代的数组中的项目的类型匹配并且与的所需类型匹配时,才为function piper(...fs) {
return (...args) => fs.reduce((args,f) => {
console.log(args);
return [f.apply(this,args)];
})[0];
}
var result = piper(Math.min, Math.abs, Math.sqrt)(16, -9, 0)
// Output result:
console.log(result);
保留初始值。结果,就像用数字操作一样:
fns
当然,如果有可能遍历为空的数组,则还应该提供一个初始值。
在几乎所有其他情况下,.reduce
的工作必须提供一个初始值。