代码之家  ›  专栏  ›  技术社区  ›  Maxxx

理解当前函数

  •  1
  • Maxxx  · 技术社区  · 7 年前

    我是Javascript和Typescript的新手,我发现理解Typescript非常困难,尤其是curring函数和箭头语法。

    所有这一切,当我一直在使用语法,从Java的函数:

    function(param) {
       ..dosomething..
       .
    }
    

    启动javascript会导致箭头语法函数,我觉得这些函数很难理解。在typescript中,我遇到curring,这里有如下示例:

    const operationOnTwoNumbers = f => x => y => f(x,y)
    
    const multiply = operationOnTwoNumbers((x,y) => x*y)
    
    const double = multiply(2)
    
    [5,8,3,1,7,6,2].map(double)
    

    我没有听过这么详细的演讲,但是根据我的幻灯片,它说乘法是一个curried函数。

    首先,我想知道如何解释operationntwonumbers箭头语法函数。现在,我这样解释:

    操作编号 是一个 功能 那就接受了 作为论据 ,并返回一个函数 x作为论据 返回一个函数 作为论据 返回一个函数 对x和y做点什么。

    我的解释对吗?希望得到一些反馈。

    现在是乘法curried函数。我的解释是:

    是一个函数 将operationTwonumbers作为函数 ,那个 操作次数(x,y) 作为一个论点 返回函数 使x和y相乘。

    我很确定我对这些的解释在某种程度上是错误的,但我似乎不能理解语法。我得到的资源没有解释太多,我试着用谷歌搜索,结果发现我越来越困惑。

    如果能帮上忙,我将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  2
  •   T.J. Crowder    7 年前

    首先,让我们添加一些缺少的分号,因为没有它们,代码将以一种模糊的方式失败(ASI不会添加 ; 之间 multiply(2) [5,8... 因为综合起来它们在语法上是有效的,尽管逻辑上是荒谬的)。我们还要加一个 console.log 在最后一行:

    const operationOnTwoNumbers = f => x => y => f(x,y);
    const multiply = operationOnTwoNumbers((x,y) => x*y);
    const double = multiply(2);
    console.log([5,8,3,1,7,6,2].map(double));
    

    (你说过你对JavaScript和TypeScript很陌生。我强烈建议 依靠ASI。投入 ; 在不是以块结尾的流控制结构的所有语句的结尾。所以你在上面的地方会有一个,而你不会有一个 while (condition) { ... } 声明。)

    operationntwonumbers是一个以f为参数的函数,它返回一个以x为参数的函数,该函数返回一个以y为参数的函数,该函数返回一个对x和y执行某些操作的函数。

    我的解释对吗?

    差不多了。 “…返回一个以y为参数的函数,该函数返回对x和y执行某些操作的函数。” 不正确,应该是 “…返回调用的结果 f 传入 x y ." (而且,从技术上讲, f型 , ,和 是的 参数 ,不是参数,但通常称之为参数,这样做不会遇到太多麻烦。)因此,完整的解释是:“ operationOnTwoNumbers 是一个接受 f型 作为参数,并返回一个 作为参数返回 是的 作为返回调用结果的参数 f型 传入 是的 ."

    查看等效的非箭头版本可能会有所帮助(因为这些函数除了简洁性之外,没有使用箭头函数的任何功能):

    const operationOnTwoNumbers = function(f) {
        return function(x) {
            return function(y) {
                return f(x,y);
            };
        };
    };
    

    乘法是一个将operationntwonumbers作为函数的函数,operationntwonumbers将(x,y)作为参数并返回一个将x和y相乘的函数。

    不完全是, multiply 结果 打电话 操作编号 传递一个函数, (x, y) => x * y (这将成为 f型 在里面 操作编号 ). 所以 函数是由 操作编号 接受 .

    那么 double 是呼叫的结果 具有 2 ,所以 2个 变成 双重的 是接受 是的 . 例如,如果我们 double(3) ,然后 3 是的 从那以后 2个 f型 (x,y)=>x*y ,调用的结果 双(3) 6 .

    然后 map 呼叫 双重的 对于数组中的每个条目,返回一个新数组,每个值加倍。


    ¹ 参数 与。 论点 :函数声明 参数 ;当你 呼叫 函数,则为该参数提供参数。例如:

    function example(v) {
        return v * 2;
    }
    console.log(example(7));
    

    example , v 是一个参数(特别是 形式参数 ). 在电话里 example(7) , 7 是关于 参数。