javaScript函数柯里化

举报
搞前端的半夏 发表于 2022/06/30 21:51:16 2022/06/30
【摘要】 本文主要介绍JavaScript中的一种函数时编程方法–函数柯里化在正式开始之前,我们先来看一下下面的例子:function x (a , b , c){ let result = a + b + c ; return result ;}console.log(x(1 , 2 , 3)) // 6上面的函数,看上去没有任何问题,我们下面换一种代码方式来重构它!function fn1(...

本文主要介绍JavaScript中的一种函数时编程方法–函数柯里化
在正式开始之前,我们先来看一下下面的例子:


function x (a , b , c){
  let result = a + b + c ;
  return result ;
}
console.log(x(1 , 2 , 3))  // 6

上面的函数,看上去没有任何问题,我们下面换一种代码方式来重构它!

function fn1(a){
  return function fn2(b) {
    return function fn3(c) {
      let result = a + b + c;
      return result;
} } }

let resultOfA = fn1(1) ;
let result = resultOfA(2);
console.log(result(3))    // 6

上面的例子演示的就是函数柯里化,相信通过这里例子,隐隐约约有些理解了!如果没有,没关系,接下来我们来通过更多的示例来学习它!

什么是柯里化

函数柯里化是将JavaScript中有多个参数的函数重构成只有单个参数的函数的技术!
换句话说:当一个函数不是一次性接受所有参数,而是接受第一个参数并返回新函数,新函数接受第二个参数并返回新新函数!以此类推,知道所有参数都可以处理,这就成为函数柯里化!

优点

函数柯里化的好处是:当我们需要使用一些相同的参数调用相同的函数时,这里可以想象这样一个场景:假设我们要计算很多个高度长度相同但是宽度不同的长方体的体积,我们通过函数柯里化,只需要改变宽度就可以了!
在这种情况下,柯里化成为一种很好的技术!因为他们的代码很容易重构!同时函数柯里化有助于创建更高阶的函数。

如何在程序中使用

函数柯里化可以使用闭包或者javaScript中的bind方法来实现。
让我们使用这两种方式来实现函数柯里化

使用bind()方法

bind()返回要作用其函数的原始函数的副本,他接受两个参数,第一个是要引用的对象引用,第二个是都好分隔的参数列表!


function fn1(a){
  return function fn2(b) {
    return function fn3(c) {
      let result = a + b + c;
      return result;
} } }

let resultOfA = fn1(1) ;
let result = resultOfA(2);
console.log(result(3))    // 6

使用闭包



let multiply = (x,y) => {
  return x*y ;
 }

/* With the help of function closure we can convert it to the below function 
syntax as */

let multiply = (x) => {
    return function (y) {
        console.log(x * y);
    }
}

/* Because when the function is returned from multiply it will remember the value of x in its lexical scope using Function Closure, we 
can use it as  */

let multiplyByTwo = multiply(2);
multiplyByTwo(4)   //  8

let multiplyByTen = multiply(10);
multiplyByTen(4)   //  40

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。