函数中的闭包、柯里化以及反柯里化函数介绍、函数种参数和返回值的注意点

函数的参数和return事项

函数的参数

1、参数是局部变量 ,优先级高于同名的全局变量。

2、是为了解决函数的抽象化、多态化。具备模块化功能。

3、js因为是弱引用语言,参数可以多样化变化,但也因此造成了函数中需要对参数做大量的判断。

4、参数也可以作为递归中初始设置变量。

5、在多函数中,参数可以被作为中介值来回传递,并且处理,减少全局变量。

6、js中参数没有初始值(ES5),参数是没有类型区分(大量判断)

参数的先后问题 (必须参数在前,不必须参数在后),(ES5)参数没有若干但是有arguments

函数的return

1、使用return跳出函数,条件作用时,使用return可以解决多分支解构。

return使用跳出时直接跳出循环或者条件,返回undefined

使用return可以在 setInterval或者快速连续调用时用于防抖 ,使用return可以完成函数的开关操作

2、工厂模式种使用return返回对象。

3、单例模式后续我会发布具体单例模式的详细介绍

4、返回参数对象

5、如果参数是函数,返回回调函数的结果

6、返回数组或者对象,用于返回多个元素

7、返回函数体

闭包

闭包是指有权访问另一个函数作用域中的变量的函数,
创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量

特点:函数嵌套函数、函数内部可以引用外部的参数和变量。

function fn1(){
        var a=1;
        // 因为返回的函数被存储在全局变量中,
        // 并且这个返回的函数使用这个a的局部变量,因此a被保存在堆中
        return function(){
                a++;
                console.log(a);
         }
     }

闭包优点:

1、希望一个变量长期驻扎在内存中

2、为了解决变量污染

3、为了得到私有变量

缺点:

参数和变量不会被垃圾回收机制回收、会造成内存泄漏。

柯里化函数

把接收多个参数的函数变换成接收一个单一参数的函数

这里用求和来举个例子

function curry(fn){
            var arr = [];
            return function(){
                if(arguments.length>0){
                    arr = arr.concat(Array.from(arguments));
                    return arguments.callee;
                }else{
                    return fn.apply(null,arr)
                }
            }
        }
        function fns(){
            return Array.from(arguments).reduce((value,item)=>value+=item)
        }
var sum = curry(fns);
        // sum(1);
        // sum(2,3,4);
        // sum(5,6);
        var s = sum(1)(2,3)(4,5,6)()
        console.log(s)
反柯里化函数

把单一的一个参数添加到多个参数中来处理

Function.prototype.unCurrying=function(){
       var self=this;
       return function(){
            return  Function.prototype.call.apply(self,arguments);             
             }
         }
var push=Array.prototype.push.unCurrying();
function getSum(){
      push(arguments,5);
      console.log(arguments)
 }
 getSum(1,2,3,4);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值