javascript - redux中的compose函数遇到的问题

查看:109
本文介绍了javascript - redux中的compose函数遇到的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

这是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值的函式中,像问题中的例子一样。它是为了简化语句而使用的,例如下面的范例:

function f(){
  if(x){
   foo();
   return bar();
  }else{
   return 1;
  }
}

经过压缩工具(Closure Compiler)后会变成这样:

function f(){return x?(foo(),bar()):1}

三元运算子(?:)在这里被用来简化,三元运算子中的(foo(),bar())即是组合了原本的二个表述式(语句),并按顺序执行。

逗号表述式很少在一般的撰写代码中见到,有个原因是它的阅读性不高,但在压缩工具(或编译器)中很常用到,因为它可以减少语句。

有个语句会看到逗号表述式的运用,就是在for语句的圆括号(())里,像下面的范例:

for (var i = 0, j = 9; i <= 9; i++, j--){
    //...
}

但一般常见的变量宣告像下面这样,并不是逗号表述式,var语句对逗号的行为有另外的方式处理。

var x=0, y=1;

//相等于
var x=0;
var y=1;

一般情况很少用,我们写的代码尽可能追求容易阅读,不差那一两个语句,至于要减少代码字数这件事是编译器或压缩工具的事。

当然,这是个函式库源码去了,高手在写代码的水平自然不会和一般人(像我)一样,用的都是高超的简洁语法。

这篇关于javascript - redux中的compose函数遇到的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆