JS对于闭包和递归的理解

有过一些JS基础的小伙伴应该知道这两个概念今天分享下我的一些理解

递归:

简单理解就是自己调用自己,

函数内部调用自身就是递归、自己不断调用自己会形成循环来达成某些功能、但要加退出条件以免变成死循环

举个栗子:深层次 数据结构中根据商品ID查询该商品

 const data = [
    {
      id:1001,
      className:'显示器',
      goods:[
        {
          id:1101,
          className: 'AOC27G2',
          price:1368,
        },
        {
          id:1102,
          className: '三星玄冰骑士',
          price:1168,
        },
      ]
    },
    {
      id:2001,
      className:'CPU处理器',
      goods:[
        {
          id:2101,
          className: '英特尔酷睿I3-12100F',
          price:786,
        },
        {
          id:2102,
          className: 'AMD锐龙R5-3600',
          price:959,
        },
      ]
    },
    {
      id:3001,
      className:'显卡',
      goods:[
        {
          id:3101,
          className: 'GTX-1050TI',
          price:1050,
        },
        {
          id:3102,
          className: 'GTX-1650',
          price:1199,
        },
      ]
    },
  ]

      let e = []
  function GetData(json,id) {

      json.forEach(item => {
        if (item.id == id){
          //console.log(item);
          e.push(item)
        }else if (item.goods && item.goods.length > 0){
          e = GetData(item.goods,id)
        }
      })
      return e

  }

    console.log(GetData(data, 1001))  
    console.log(GetData(data, 2102)) 
    console.log(GetData(data, 3101)) 
    console.log(GetData(data, 4444)) 

查询了四次第四次没有查询到就没有push进到数组里

闭包:

一般来说内部函数可以使用外部全局变量、外部无法直接使用函数内部的变量

 闭包的主要作用 就是延申了变量的作用范围、

还有第二点:

闭即封闭,既然是封闭, 那为什么要封闭呢?封闭的重要作用是什么?  一定是隔离? 为什么要隔离,一定是为了避免污染,在避免污染的情况下,  延申变量作用域  让外部能用 函数内部的变量

var fun=function(){
var obj={};
obj.getNumber=function (){  return 1;}
return obj;
}

使用闭包的场景是在,页面方法函数特别多,担心写的函数被污染,就会用一个闭包,包裹下

我们再来举一个打车的例子:

start 起步价   total 总价  add 每公里价格  fen 起步价包含公里  dirve 堵车加价

  /** 计算打的费用 **/

  let car  =(
      function () {
      let start = 8,total = 0,add = 3,fen = 2,dirve = 10;
      return {
        price : function (n) {
            if (n <= fen){
              total = start
            }else {
              total = ((n-fen)*add) + start
            }
            return total
        },
        du:function (flag) {
          flag ? total += dirve : total
          return total
        }
      }
    }
  )()

  console.log(car.price(14))
  console.log(car.du(false))
  console.log(car.du(true))
  console.log(car.price(2))

注意:一般情况下函数调用完毕后 内部的变量都会被释放销毁、使用闭包要避免内存泄漏

其他补充:闭包为什么会造成内存泄漏_whose_moon月的博客-CSDN博客_闭包为什么会造成内存泄漏

1、父函数里面嵌套的子函数,子函数访问父函数的局部变量。
2、通过return将子函数暴露到全局作用域,子函数就形成闭包。
3、通过闭包,父函数的局部变量没有被销毁,可通过闭包去调用 ,但同时,这个局部变量也不会被全局变量污染。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值