Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js-高阶一元函数-为什么需要这个?_Javascript_Higher Order Functions_Currying - Fatal编程技术网

Javascript js-高阶一元函数-为什么需要这个?

Javascript js-高阶一元函数-为什么需要这个?,javascript,higher-order-functions,currying,Javascript,Higher Order Functions,Currying,从这里开始:下面的代码片段没有按预期工作: ['1', '2', '3'].map(parseInt) // [1, NaN, NaN] <- bad output 我的问题是: 这个一元函数是如何工作的 在任何实际场景中,此功能(或至少是一般的想法)都会得到很好的使用 任何帮助都将不胜感激:) 未来读者注意:结帐 这个一元函数是如何工作的 函数的长度是指在第一个参数具有默认值*之前,它拥有多少已声明的非rest参数。因此,unary通过查看函数是否声明只接受一个参

从这里开始:下面的代码片段没有按预期工作:

['1', '2', '3'].map(parseInt)           // [1, NaN, NaN] <- bad output
我的问题是:

  • 这个
    一元
    函数是如何工作的
  • 在任何实际场景中,此功能(或至少是一般的想法)都会得到很好的使用
  • 任何帮助都将不胜感激:)


    未来读者注意:结帐

    这个一元函数是如何工作的

    函数的
    长度
    是指在第一个参数具有默认值*之前,它拥有多少已声明的非rest参数。因此,
    unary
    通过查看函数是否声明只接受一个参数,如果接受,则返回原始函数,如果不接受,则创建一个只使用一个参数调用原始函数的新函数

    此检查不可靠,我不会使用该版本的一元代码。许多函数根据它们得到的实际参数的数量来改变它们的行为,即使它们只声明了一个参数

    在任何实际场景中,此功能(或至少是一般的想法)都会得到很好的使用

    一个总是做包装的版本(不看
    长度
    )对于类似于
    parseInt
    一个的情况可能很方便:您只想用X个参数(在您的例子中是1个)调用另一个函数,而不管回调函数提供了多少参数

    这种事情在中国很常见。如果您一般不做函数式编程,那么在使用箭头函数的今天,它可能没有多大用处。但是相当多的人以功能性的方式使用JavaScript


    *是的,有那么复杂。示例(需要支持ES2015[aka“ES6”]默认参数值和rest参数的浏览器):

    函数a(一){}
    函数b(一,二){}
    函数c(一,二,…剩余){}
    函数d(1,2=42,…rest){
    函数e(一,二=42,三){}
    console.log(a.length);//1.
    console.log(b.length);//2.
    console.log(c.length);//2.
    console.log(d.length);//1.
    console.log(e.length);//1
    这个一元函数是如何工作的

    函数的
    长度
    是指在第一个参数具有默认值*之前,它拥有多少已声明的非rest参数。因此,
    unary
    通过查看函数是否声明只接受一个参数,如果接受,则返回原始函数,如果不接受,则创建一个只使用一个参数调用原始函数的新函数

    此检查不可靠,我不会使用该版本的一元代码。许多函数根据它们得到的实际参数的数量来改变它们的行为,即使它们只声明了一个参数

    在任何实际场景中,此功能(或至少是一般的想法)都会得到很好的使用

    一个总是做包装的版本(不看
    长度
    )对于类似于
    parseInt
    一个的情况可能很方便:您只想用X个参数(在您的例子中是1个)调用另一个函数,而不管回调函数提供了多少参数

    这种事情在中国很常见。如果您一般不做函数式编程,那么在使用箭头函数的今天,它可能没有多大用处。但是相当多的人以功能性的方式使用JavaScript


    *是的,有那么复杂。示例(需要支持ES2015[aka“ES6”]默认参数值和rest参数的浏览器):

    函数a(一){}
    函数b(一,二){}
    函数c(一,二,…剩余){}
    函数d(1,2=42,…rest){
    函数e(一,二=42,三){}
    console.log(a.length);//1.
    console.log(b.length);//2.
    console.log(c.length);//2.
    console.log(d.length);//1.
    console.log(e.length);//1
    这个一元函数是如何工作的

    函数的
    length
    属性返回函数具有的形式参数数*。
    一元函数检查函数是否有一个形式参数。如果是这样,它只返回原始函数。如果不是,则返回一个新函数,该函数接受单个参数,将其传递给
    f
    ,并返回结果

    在任何实际场景中,此功能(或至少是一般的想法)都会得到很好的使用

    如示例所示,某些函数会根据传入的参数数量改变其行为。通常(例如当您使用
    .map
    )时,您实际上只想传入一个参数,
    unary()
    有助于实现这一点


    *或者至少过去是这样。随着ES6的发布,它现在变得更加复杂了。详见T.J.Crowder的答案

    这个一元函数是如何工作的

    函数的
    length
    属性返回函数具有的形式参数数*。
    一元函数检查函数是否有一个形式参数。如果是这样,它只返回原始函数。如果不是,则返回一个新函数,该函数接受单个参数,将其传递给
    f
    ,并返回结果

    在任何实际场景中,此功能(或至少是一般的想法)都会得到很好的使用

    如示例所示,某些函数会根据传入的参数数量改变其行为。通常(例如当您使用
    .map
    )时,您实际上只想传入一个参数,
    unary()
    有助于实现这一点



    *或者至少过去是这样。随着ES6的发布,它现在变得更加复杂了。有关详细信息,请参见T.J.Crowder的答案。

    在这个一元函数中,fn.length检查parseInt的参数长度, 如果parseInt只有一个参数,那么它会像往常一样返回函数。但在这种情况下, 我们有两个
    ['1', '2', '3'].map(a => parseInt(a))   // [ 1, 2, 3 ] <- good output
    
    const unary = (f) => {
      return f.length === 1 ? f : (args) => f(args)
    }
    
    ['1', '2', '3'].map(unary(parseInt)) // [ 1, 2, 3 ] <- good output again!