20-JS高阶函数

闭包和回调任意一个用在函数上,都是高阶函数

一、闭包

闭包的概念:

​ 一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

未形成闭包

function test (fn) {
            var a = 1;  
            return fn();
}


test(function () {
        console.log(a);
 })

写一个函数,参数是初始数字
函数提供加减和获取值得方法
加减方法参数是每一次要加减的值

  function Calculate(initialNumber){
            var _number = Number(initialNumber) >>> 0;

            function add(num){
                _number += num;
                console.log(_number);
            }

            function minus(num){
                _number -= num;
                console.log(_number);
            }

            function value(){
                console.log(_number);
            }

            return{
                add: add,
                minus: minus,
                value: value
            }
        }

        var cal = Calculate(3);
        cal.add(4);
        cal.minus(2);
        cal.value();

二、回调函数:

(1)、什么是回调函数

a函数的参数是b函数, b函数就是a函数的回调函数 callback function

call-back 回电话的意思

函数的调用叫做call 回调函数的调用 call back

如果想将任务分成两个部分,一个先执行,一个后执行,这是可以给一个函数传入另一个函数。

回调函数的意义在于将所有任务分成主函数任务和回调函数任务

Calling Task Calling-back Task

fn执行不受test函数内部程序的影响,主函数和回调函数完美隔离

test函数在执行的时候(未执行回调函数的时候),fn函数定义

function test (fn) {
  // todo...
  fn();
}

test(function () {
  console.log(123);
});
(2)、回调的应用:
1、功能扩展与接力
 function test(num,callback){
           num += 1;
           callback && callback(num);
 }

test(1, function(num){
           console.log(num);
 })

主函数实现±*/功能

回调函数接收【数字1,数字2,进行的类型计算,计算时间】四个参数,打印出日志。

 function Calculate(callback){
            return function(a,b,type){

                let result = 0;
                let _a = Number(a) >>> 0;
                let _b = Number(b) >>> 0;

                const dateTime = new Date();

                switch(type){
                    case '+':
                        result = _a + _b;
                        break;
                    case '-':
                        result = _a - _b;
                        break;
                    case '*':
                        result = _a * _b;
                        break;
                    case '/':
                        result = _a / _b;  
                        break;
                    default:
                        break;          
                }

                callback && callback(_a, _b, type, result, dateTime);

            }
        }

        var cal = Calculate(function(a, b, type, result, dateTime){
            console.log(`${dateTime}: ${a} ${type} ${b} = ${result}`);
        })

        cal(1,2,'+');
        cal(1,2,'-');
        cal(1,2,'*');
        cal(1,2,'/');
2、检验传入参数的合法性
function Test(validator){
           return function(a, b, type){
               const {isError, errorMsg} = validator(a,b);

               if(isError){
                   throw new Error(errorMsg);
               }

               switch(type){
                   case '+':
                       return a + b;
                   case '-':
                       return a - b;
                   case '*':
                       return a * b;
                   case '/':
                       return a / b;            
               }
           }
       }
        
       var test = Test(validate100);

       console.log(test(199, 100, '-'));

       function validate100(a,b){
           if(a < 100 || b < 100){
               return {
                   isError: true,
                   errorMsg: 'a和b必须大于等于100'
               }
           }

           return {
               isError: false
           }
       }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值