关于闭包(closure)

一. 什么是闭包

闭包(closure)指有权访问另一个函数作用域中变量的函数。
简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量。

<script>
 function f1(){    // fn1 就是闭包函数
    var num = 5;
    function f2(){
      console.log(num); // 10
    }
       f2()
 }
  fn1();
</script>

1.1 在 chrome 中调试闭包

  1. 打开浏览器,按 F12 键启动 chrome 调试工具。
  2. 设置断点。
  3. 找到 Scope 选项(Scope 作用域的意思)。
  4. 当我们重新刷新页面,会进入断点调试,Scope 里面会有两个参数(global 全局作用域、local 局部作用域)。
  5. 当执行到 f2() 时,Scope 里面会多一个 Closure 参数 ,这就表明产生了闭包。

二. 闭包是如何产生的

当一个嵌套内部的子函数访问嵌套外部的父函数的变量(函数)时,就产生了闭包。

三. 闭包的作用

  1. 使用用函数内部的变量(局部变量)在执行完后,仍然存活在内存中,
    延长了局部变量的声明周期。
  2. 然函数外部可以操作函数内部的变量(函数)。

四. 闭包的应用

// 闭包应用-计算打车价格 
        // 打车起步价13(3公里内),  之后每多一公里增加 5块钱.  用户输入公里数就可以计算打车价格
        // 如果有拥堵情况,总价格多收取10块钱拥堵费
        // function fn() {};
        // fn();
        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;
                }
            }
        })();
        console.log(car.price(5)); // 23
        console.log(car.yd(true)); // 33

        console.log(car.price(1)); // 13
        console.log(car.yd(false)); // 13

总结:
闭包在嵌套函数内部执行完时就产生了,闭包在嵌套的内部函数成为垃圾对象时就销毁。
它的缺点是函数执行完后,函数内部的局部变量没有释放,因此,闭包能不用就不用,如果使用到了闭包需及时释放,否则会导致内存泄漏。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值