js闭包是什么

定义:闭包(closure)就是能够读取其他函数内部变量的函数。在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成 “定义在一个函数内部的函”。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。(闭包的最典型的应用是实现回调函数(callback) )。

闭包的实例

function foo(a) {
  var b = a + 1;
  function bar(c) {
    console.log(a, b, c);
  }
  return bar;
}
let result = foo(1);
result(3);
//控制台打印1,2,3

从上面的例子我们可以看出。函数bar嵌套在函数foo里面,然后运行foo返回的是bar函数,之后再运行foo调用后的结果实际上执行的是bar,最后bar函数会执行输出123

实际上面的例子其实就创建了一个闭包,这是因为函数foo外的变量result引用了函数foo内的函数bar。也就是说,当函数foo的内部函数bar被函数foo外的一个变量引用的时候,就创建了一个闭包。

闭包有什么用呢

简而言之,闭包的作用就是在foo执行完并返回后,闭包使得Javascript的垃圾回收机制不会收回foo所占用的资源,因为foo的内部函数bar的执行需要依赖foo中的变量。 

在上面的例子中,由于闭包的存在使得函数foo返回后,bar中的c始终存在,这样每次执行result(3),函数bar接受3然后输出a,b,c

那么我们来想象另一种情况,如果foo返回的不是函数bar,情况就完全不同了。因为foo执行完后,bar没有被返回给foo的外界,只是被foo所引用,而此时foo也只会被foo引 用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数foo和bar就会被回收。

应用的场景

  1. 访问函数内部的变量

  1. 让变量始终保持在内存中

闭包的缺点和解决方案

  • 函数执行完后, 函数内的局部变量没有释放, 占用内存时间会变长

  • 容易造成内存泄露

解决

能不用就不用,或者用为将其置为null

猜你喜欢

转载自blog.csdn.net/weixin_56661658/article/details/128749434