闭包很难吗?不难!

一:介绍闭包之前

1.在介绍闭包之前大家先看下面的代码

再看


图片截的有点丑,不好意思哈

上面代码的输出结果是 // 11 12 13...... 

再来看另外一种情况

大家肯定注意到代码其实没有变化只是,我们在函数里面定义变量 a 而已

结果却大为不同,因为在函数外定义变量它就是全局变量了,在函数执行完

毕之后,其变量不会被js的垃圾回收机制回收,只有当你手动关闭浏览器之

后,它的内存才会被销毁(变量回收等价于销毁内存),那么有方法让局部

变量内存不被销毁吗?那就得扯下闭包了

2:闭包是个啥?

闭包是指有权访问另一个函数作用域的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。——Nicholas C.Zakas (摘自JavaScript高级程序设计)

1.举个栗子

    

上面就是一个典型的闭包咯,包含 outer()和一个匿名函数,匿名函数使用了外部函数作用域的变量localval,outer()()就是调用里面的匿名函数

 2.关于闭包的this指向问题


由于匿名函数的执行环境具有全局性,因此this此时指向window,为什么结果不是world呢函数在被调用时会自动取得变量this,内部函数通过作用域链搜索这个变量时,只能搜索到其活动对象为止,因此获取不到外部作用域的this变量,不过我们可以用另外的方法将其获取


将this以活动对象的形式保存起来(所谓活动对象就是显示的变量,this变量是隐式的),这样我们就可以得到obj的name值了,是不是很nice

3:闭包引起的内存泄漏

1.什么是内存泄漏

我们都知道,计算机分配给浏览器的内存是有限的,而如果变量一直不能被回收,计算机内存会撑爆,这就是内存泄漏,而闭包就会引起这样的问题,因为创建闭包之后,其作用域链中的变量会一直存在着,无法销毁,所占用的内存会越来越大。

2.解决内存泄漏

闭包函数中引用外部函数作用域里的变量oBtn,我们只有将其置为null,这样才可以确保其内存被销毁,这其实就跟最最前面写的一样,跟全局变量一样内存不会被销毁,我们在使用闭包的同时一定要正确释放其内存,否则后果严重


结束了,希望我写的这些能够对大家了解闭包有所用!






转载于:https://juejin.im/post/5cbc2677f265da03761e8897

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值