说说对闭包的理解

说说对闭包的理解

闭包是什么

内层函数引用了外层函数作用域中的变量,导致外层函数执行完之后,它的作用域仍然存在,被内层函数引用的变量没有被垃圾回收处理,而是仍然存在于内存中,这就形成了一个闭包。

闭包解决了什么问题

  1. 在函数外部可以拿到函数内部的变量的值。
  2. 可以让变量的值始终保持在内存中,不会在函数调用后被清除。

闭包有什么应用场景

  1. 输出连续数字
    for(var i=1;i<=10;i++){
        ((j)=> {
            setTimeout(function() {
                console.log(j)  // 输出1-10
            }, 1000)
        })(i)
    }
    // 声明了10个立即执行函数,保存当次循环的值到内部

    这是在ES6之前的方法,在ES6之后可以选择直接用let声明变量,就可以不用闭包了。(为什么用let声明可以达到这个效果呢,详见在for循环中,用let和用var声明循环变量的区别

  2. 模拟私有变量

在Javascript中没有私有变量的定义方式,可以用闭包来模拟

function counter(){
    var privateParam = 0
    function changeBy(val) {
        privateParam += val
    }
    return {
        increment: function(){changeBy(1)},
        decrement: function(){changeBy(-1)},
        value: function(){return privateParam},
    }
}
var doCounter = counter()
doCounter.val() //0
doCounter.increment() //1
doCounter.increment() //2
doCounter.decrement() //1

闭包有什么缺点

1. 使变量在内存中一直存在得不到释放,消耗内存,影响页面性能。解决方法是在函数退出之前,将变量删除。

2. 在函数外部可以修改函数内部的变量,使得变量的变化不好追溯。


参考资料:

对闭包的认识

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值