重要:js闭包机制以及它的优缺点和应用场景

闭包的概念

一.变量作用域
全局变量 如果函数内部定义变量时不使用var,会变成全局变量。
局部变量
js的特殊之处:函数内部可以直接读取全局变量。但是函数外部无法直接读取局部变量。为了解决这个问题,我们引入了闭包机制。
二.闭包机制
在函数的内部再定义一个函数,子函数可以访问父函数内部的变量(原理是原型链机制),再在函数外部调用子函数,此时子函数相当于一个接口,我们就实现了在函数外部读取局部变量的愿望。
三.注意事项
闭包机制会引起内存泄漏。所以在退出函数之前,要将不使用的局部变量删除。
滥用闭包会导致网页性能过低,函数变量都被保存在内存中,内存消耗很大。
不要随便改变父级函数内部的变量。
创建闭包的方式
构造函数方式:所有变量都保存在内存里,影响网页性能,建议退出前删除变量。
new function() {
var 变量…
}
内联函数方式:按需索取内存,消耗较小。
(function() {
var 变量…
})();

闭包的优点:
闭包可以访问三个作用域中的变量
  1、在自己作用域中声明的变量
  2、在父函数中声明的变量
  3、在全局作用域中声明的变量

闭包的缺点:闭包会使得变量都保存在内存中,内存消耗很大,不能滥用闭包,否则会造成网页的性能问题,ie中会造成内存泄漏。在退出函数前,将不使用的局部变量全部删除。
闭包会在外部改变父元素内部的值,如果将父元素当作对象,闭包当作公用方法,将内部变量当作他的私有属性,不要随便改变父元素内部的变量。

闭包的运用场景 经典

1、保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。

2、在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。
 例如:在这里插入图片描述
 同事没有使用闭包,由于Javascript的垃圾回收机制(在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。),而且使用的是全局变量var,因为var是没有块级作用域的,所以在for循环中声明的i会存在于函数作用域中。每一次for循环就会声明一次i,但后面声明的变量会 **覆盖前面声明的变量。 所以当for循环执行完后,变量成为一个死值,后期调用时,打印出的是相同的最后一个值。
 使用闭包,变量不被销毁,它就会进行下一次的++;

参考博文

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值