源码拿走+详细注释,欢迎学习-javascript 的函数柯里化

1. @[TOC](javascript 的函数柯里化)

   # 概念
   > 柯里化(currying),又称为部分求值,一个柯里化函数首先会接受一些参数,但是不会立即参与求值,而是将其保存在闭包中,并返回一个函数,在需要求值时,会将存在闭包中的变量拿出来求值。

   __在理解柯里化之前需要先理解闭包__

   # 举例
   ```javascript
       var currying = function(fn){
           var args = [] // 1. 先提前声明了一个闭包变量,用来存储值
           return function() { // 2. 返回出去一个闭包函数
               if( arguments.length === 0){ // 3. 当没有传参时,把执行 cost 函数,并将 args 闭包变量传入
                   return fn.apply(this , args)
               }else {
                   [].push.call(args, arguments) // 4. 有参数时,把参数 push 到 args 闭包变量中
                   return argument.callee
               }
           }
       }
   
       var cost = (function(){
           var money = 0 // 闭包变量,存放值的和
           return function(){
               for(let i=0; i<arguments.length;i++ ){
                   money += arguments[i]
               }
               return money
           }
       })()
   
       var cost = currying(cost) // 将 cost 函数柯里化
       cost( 1 ) // 未真正执行 cost 里的闭包函数
       cost( 2 )  // 未真正执行 cost 里的闭包函数
       cost( 3 )  // 未真正执行 cost 里的闭包函数
       cost() // 求值计算 6
   ```
   以上示例就是一个简单的柯里化思想,它做了几件事:
       1. 声明了一个 currying 函数,内部 return 的函数会通过传入的参数判断它是否需要求值。
       2. 把真正需要求值的代码分离成 cost 函数。
       3. 调用 currying 将 cost 函数柯里化。
       4. 调用 cost 。
   # 反柯里化 (uncurrying)
   > 柯里化是闭包需要真正执行的函数,而反柯里化则是扩大函数和对象所拥有的方法,在自身没有此方法时去借调不属于它的方法。
   ## 示例
   ```javascript
       var uncurrying = function(){
           let _that = this
           return function() {
               var obj = Array.prototype.shift.call( arguments )
               return _that.apply(obj , arguments)
           }
       }
       
       var push = Array.prototype.push.uncurrying()
       var obj = {
           '0': 1,
           'length': 1
       }
       push(obj , 2)
       console.log(obj) // { '0': 1,'1': 2,'length': 1 }
   ```
   简单来说,其实就是改变了 push 函数里this的指向,使得 push 的 this 指向了 obj ,让 obj 也扩展了 push 方法。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打工人何苦为难打工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值