js闭包

js闭包

一.js闭包的条件:
1. 在函数 A 内部直接或者间接返回一个函数 B,
2.B 函数内部使用着 A 函数的私有变量(私有数据),
3. A 函数外部有一个变量接受着函数 B
我们管这个不会销毁的 a 函数的执行空间叫做 闭包空间。

   function a() {
      // 这个 num 变量就是函数 a 的私有变量
      var num = 100

      return function b() {
        console.log(num)
      }
    }
    // pon接受的是 a 函数执行以后的返回值
    // pon接受的就是函数 a 内部返回的一个复杂数据类型(函数b)
    //   导致函数 a 的执行空间不会销毁
    var pon= a()

    // 从现在开始, pon随时可以是一个 函数a 里面返回的 函数b
    //   pon随时可以调用
    pon()

二.js闭包的特点(优点和缺点并存)

function f1() {
	var num = 10
	return function f2() {
		
		console.log(num++)
	}
}

var res = f1()

1.延长变量的声明周期
优点: 变量会一直存在
缺点: 一个不会销毁的函数执行空间

	列如再上一个函数f1()
+   在执行的时候, 会生成一个函数执行空间
+   在这个函数执行空间里面有一个 num 变量
+   等到代码执行完毕, 这个执行空间就销毁了
+   那么函数里面的私有变量 num 也不存在了
  1. 可以在函数外部访问内部数据
    优点: 函数外部访问内部数据
    缺点: 需要一个不会销毁的函数执行空间

      //列如在全局变量访问函数f1()这个函数
      console.log(num)
      + 报错, 没有这个变量
      + 因为 num 是函数f1的私有变量,在函数数内部可以访问
      + 在函数外部不能访问函数内部的私有变量
    
  2. 保护私有变量
    优点: 内部的变量不能再外部访问
    缺点: 闭包空间可以访问内部数据

闭包的函数的缺点 致命

 	+因为当一段内存空间中有一个不会被销毁的东西一直存在
    +那么就会出现内存占用, 如果过多, 就会导致内存溢出
   	+那么结果就是 内存泄漏

三.闭包的用途:

1、可以读取函数内部的变量 ,保护函数内的变量安全。

以上面一个列子为列函数f1中i只有函数f2才能访问,而无法通过其他途径访
问到,因此保护了num的安全性。

2.让这些变量的值始终保持在内存中。

依然如上面的那个,由于闭包,函数f1中i的一直存在于内存中,因此每次执
行res(),都会给num自动加1。

四,使用闭包时要注意

1.闭包会使得函数中的变量都被保存在内存中

由于闭包会使得函数中的变量都被保存在内存中,就会占用内存使的内存消
耗较大,所以在写代码时的时候能不使用闭包就不要去使用闭包,否则会造成
网页的性能问题,使得网页产生的卡顿,在IE中可能导致内存泄露。

解决的办法

解决的办法就是在退出函数之前把不需要使用的局部变量全部删除。

2.闭包会在父函数外部,改变父函数内部变量的值

所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法
(Public Method),把内部变量当作它的私有属性(private value),这时
一定要小心,不要随便改变父函数内部变量的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值