js闭包和递归函数解释加案例

本文深入探讨了闭包和递归函数的概念及其在实际编程中的应用。闭包允许在一个作用域内访问另一个作用域的局部变量,扩大了变量的使用范围,但过度使用可能导致内存泄露。递归函数通过自身调用实现深层遍历,提供了处理复杂数据结构的有效手段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

闭包的概念:在一个作用域里调用另外一个作用域的局部变量

闭包的作用:扩大局部变量的使用范围

闭包的缺点:使用过多可能会造成内存的泄露,因为原来函数内部的变量使用完后就应该被销毁,释放内存,但是由于闭包里的函数还得要继续使用某一些变量,所以这些变量不会被销毁,闭包使用过多的话就会导致内存的泄露了

总结:闭包不一定是好的,使用前要考虑好是否有必要使用闭包
一个经典案例

<ul class="nav">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
    <script>
        // 目的点击li输出当前li的索引号
        var lis = document.querySelector('.nav').querySelectorAll('li');
        //  利用闭包的方式得到当前小li 的索引号
        for (var i = 0; i < lis.length; i++) {
            // 利用for循环创建了4个立即执行函数
            // 立即执行函数也成为小闭包因为立即执行函数里面的任何一个函数都可以使用它的i这变量
            (function(i) {  //接受i
                lis[i].onclick = function() {   //给当前i的li添加点击事件
                              console.log(i);   由于当前再立即执行函数中,所以会立即把i存放在这个输出语句中,而不会再把循环结束后的i传进来
                }
            })(i);			//把当前的i传进去当索引号
        }
    </script>

递归函数

就是在一个函数内部调用自己这个函数,一般用来做深层遍历
一个经典的案例:

<script>
        var data = [{
            id: 1,
            name: '家电',
            goods: [{
                id: 11,
                gname: '冰箱',
                goods: [{
                    id: 111,
                    gname: '海尔'
                }, {
                    id: 112,
                    gname: '美的'
                },]
            }, {
                id: 12,
                gname: '洗衣机'
            }]
        }, {
            id: 2,
            name: '服饰'
        }];

        function getDate(arr, id) {   //调用这个函数,返回你传进来id所对应的对象
            var a = {};
            arr.forEach(function(value) {   //使用forEach来遍历数组,进行查找数据,当然这里使用for循环也挺方便
                if(value.id == id){   //判断是否是你所想要的id数据
                    a=value;        //是的话就将value存在a中,下面再返回出去
                }else if(value.goods && value.goods.length > 0){
                   a= getDate(value.goods, id);  //调用自身,来进行深层遍历,把得到的返回对象再放在这个a中,下面再返回
                }
            });
            return a;   //不管是第一层遍历还是第几层遍历,只要找到了,都会有个值返回
        }
        console.log(getDate(data, 1));
        console.log(getDate(data,11));
        console.log(getDate(data,111));
        console.log(getDate(data,12));
        console.log(getDate(data,2));
    </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值