闭包和递归

闭包

1.什么是闭包

闭包(closure)指有权访问另一个函数作用域中变量的函数
简单理解 一个作用域可以访问另一个函数内部的局部变量
作用 延伸了变量的作用范围
举个栗子

function fn() {
  var num = 10;

  return function () {
    console.log(num);
  };
}
var f = fn();
f(); //10

2.案例 1

<script>
// 1. 我们可以利用动态添加属性的方式 获得li的索引
var lis = document.querySelector(".nav").querySelectorAll("li");
for (var i = 0; i < lis.length; i++) {
  lis[i].index = i;
  lis[i].onclick = function () {
    // console.log(i);全是4
    console.log(this.index); //点击哪个打印哪个
  };
}

// 2. 利用闭包的方式得到当前li 的索引 效率稍低存在内存泄漏
for (var i = 0; i < lis.length; i++) {
  // 利用for循环创建了4个立即执行函数
  // 立即执行函数也称为小闭包因为立即执行函数里面的任何一个函数都可以使用它的i变量
  (function (i) {
    // console.log(i);//0 1 2 3
    lis[i].onclick = function () {
      console.log(i); //点击哪个打印哪个
    };
  })(i);
}
</script>

3.案例 2

 <script>
        // 打车起步价13(3公里内),  之后每多一公里增加 5块钱.  用户输入公里数就可以计算打车价格
        // 如果有拥堵情况,总价格多收取10块钱拥堵费
        var car = (function() {
            var start = 13; // 起步价  局部变量
            var total = 0; // 总价  局部变量
            return {
                // 正常的总价
                price: function(n) {
                    if (n <= 3) {
                        total = start;
                    } else {
                        total = start + (n - 3) * 5
                    }
                    return total;
                },
                // 拥堵之后的费用
                yd: function(flag) {
                    return flag ? total + 10 : total;
                }
            }
        })();
        car.price(5); // 23
        car,price(ture);//33
    </script>

递归

函数内部调用函数本身 称之为递归

 <script>
        var num = 1;
        function fn() {
            console.log('1');
            if (num == 6) {
                return; // 递归里面必须加退出条件
            }
            num++;
            fn();
        }
        fn();
    </script>

1.案例 1

<script>
        // 利用递归函数求1~n的阶乘 1 * 2 * 3 * 4 * ..n
        function fn(n) {
            if (n == 1) {
                return 1;
            }
            return n * fn(n - 1);
        }
        console.log(fn(3));//6
        console.log(fn(4));//24

</script>

2.案例2

<script>
        // 利用递归函数求斐波那契数列(兔子序列)  1、1、2、3、5、8、13、21...
        // 用户输入一个数字 n 就可以求出 这个数字对应的兔子序列值
        // 我们只需要知道用户输入的n 的前面两项(n-1 n-2)就可以计算出n 对应的序列值
        function fb(n) {
            if (n === 1 || n === 2) {
                return 1;
            }
            return fb(n - 1) + fb(n - 2);
        }
        console.log(fb(3));
        console.log(fb(6));
    </script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值