这是redux的compose函数源码:
export default function compose(...funcs) {
if (funcs.length === 0) {
return arg => arg
}
if (funcs.length === 1) {
return funcs[0]
}
const last = funcs[funcs.length - 1]
const rest = funcs.slice(0, -1)
return (...args) => rest.reduceRight((composed, f) => f(composed), last(...args))
}
不明白最后一行: (composed, f) => f(composed), last(...args)
的箭头函数中的返回语句中用逗号分隔f(composed)和last(...args),这里是怎么执行的?
谢谢。
上面说的没错,是逗号表述式的简写法,我只是来补充的。
逗号表述式是一种特殊的简写法,它可以让原本只能用一个表述式的地方,插入多个表述式。
通常会出现在有
return
值的函式中,像问题中的例子一样。它是为了简化语句而使用的,例如下面的范例:经过压缩工具(Closure Compiler)后会变成这样:
三元运算子(
?:
)在这里被用来简化,三元运算子中的(foo(),bar())
即是组合了原本的二个表述式(语句),并按顺序执行。逗号表述式很少在一般的撰写代码中见到,有个原因是它的阅读性不高,但在压缩工具(或编译器)中很常用到,因为它可以减少语句。
有个语句会看到逗号表述式的运用,就是在for语句的圆括号(
()
)里,像下面的范例:但一般常见的变量宣告像下面这样,并不是逗号表述式,
var
语句对逗号的行为有另外的方式处理。一般情况很少用,我们写的代码尽可能追求容易阅读,不差那一两个语句,至于要减少代码字数这件事是编译器或压缩工具的事。
当然,这是个函式库源码去了,高手在写代码的水平自然不会和一般人(像我)一样,用的都是高超的简洁语法。