javaScript闭包详解

一. 闭包的概念

闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护私有变量不受外界干扰,直观的说就是形成不销毁的栈环境
闭包用一句话概括就是有权使用另一个函数作用域下的变量的函数
个人见解:
1.闭包就是函数间的跨作用域访问
2.闭包可以让外部函数访问到内部函数声明的变量
3.由于浏览器的机制它会将不使用的变量进行回收,然而闭包会一直使用函数内部的变量,所以浏览器不会对其进行回收,要想对其进行回收,只需将调用函数的值赋值为null就好了

二. 闭包的形式

  • 分配给全局变量
let baz;
const foo = function () {
  let a = 1;
  const bar = function () {
    console.log(a); //bar函数使用foo函数作用域下的变量a。当调用foo函数后,垃圾回收站机制应该回收变量a,但由于bar函数在引用变量a,这时就在内部形成一个闭包
  };
  baz = bar; //将bar函数赋值给全局变量baz
};
foo();
baz(); //1
  • 函数内部使用
const foo1 = function () {
  let a = 2;
  const bar = function () {
    console.log(a);
  };
  return bar;
};
foo1()(); //2
  • 回调函数
const foo2 = function () {
  let a = 3;
  return setTimeout(() => {
    console.log(a);
  }, 1000);
};
foo2();

三. 闭包的解释

function foo(){
    let num;
    return function(){
        let age;
        num++
    }
}
f(foo())

通过闭包就可以让外部作用域访问函数内部作用域的变量,我们知道当函数执行完以后,会立即销毁,但 foo 函数内的 num 属性被内部的匿名函数引用着,而内部函数又被外部变量 f 引用着,所以函数 foo 在执行完以后虽然会立即销毁,但它内部的匿名函数在创建的时候就会随之创建一个特殊的容器,用于保存 上层作用域 中 变量 的引用,所以foo 函数中的 num 并不会销毁,当执行第一次 f() 时,会创建 f() 对应的作用域,其中num 会从之前创建的特殊的容器中取出上层作用域中变量的值,而 age 会立即声明一个,当函数执行完毕后,就会销毁对应的作用域,此时 age 也会随之销毁,但变量 f 对应的指针地址不会变,当再次执行 f() 时,又会再创建一个 f() 对应的作用域,num 还是会从上层作用域中拿,但 age 还是会重新声明,使用完后还是会被销毁。
很显然这样会一直持有对 num 的引用,无法进行回收,造成内存占用,所以当不使用时,可以把 f 置为null,来让垃圾回收器进行回收。
在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。
如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也
会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因

四. 闭包的优缺点

优点
减少全局变量的使用,保证了内部变量的安全,同时外部函数也可以访问内部函数的变量
在内存中维持一个变量,也可以用作缓存
缺点
被引用的内部变量不能被销毁,增大了内存消耗,使用不当易造成内存泄露,解决办法可以在内部变量不使用时,把外部的引用置为 null
闭包就是函数间的跨作用域访问,会导致性能损失

五. 立即执行函数和闭包的区别

立即执行函数和闭包没有关系,虽然两者会经常结合在一起使用,但两者有本质的不同
立即执行函数只是函数的一种调用方式,只是声明完之后立即执行,这类函数一般都只是调用一次(可用于单例对象上),调用完之后会立即销毁,不会占用内存
闭包则主要是让外部函数可以访问内部函数的作用域,也减少了全局变量的使用,保证了内部变量的安全,但因被引用的内部变量不能被销毁,增大了内存消耗,使用不当易造成内存泄露

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@luffy27

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值