我有一个朋友,她教我这样理解闭包

60 阅读3分钟

经典一:什么是闭包?

“js官方解释”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。这样的解释太过于高大尚,说人话就是:闭包(closure)就是能够读取其他函数内部变量的函数,闭包是一个函数,有很多时候我们都会使用到闭包,但是我们不一定察觉到,闭包是将函数内部和外部连接起来的桥梁

1.1理解变量作用域

要想理解闭包,先要理解作用域

  1. 作用域分为两种:全局作用域和局部作用域
  2. JavaScript中函数内部可以获取全局变量,但是函数外部不能获取函数内部的变量
  3. 注意点:函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

1.3代码理解闭包

  let age = 20
  function fn(){
    let num = 10
    // fn1函数 + num引用 形成闭包
    function fn1(){
      console.log(num)//10
      console.log(age)//20
    }
    fn1()
  }
  fn()

代码特点: 1.函数fn1嵌套在函数fn里面 2.函数fn1调用了函数fn里面的变量

   这样在执行完后,这段代码其实就创建了一个闭包,这是因为函数fn1里面调用了函数fn里面的变量。也就是说,一个函数能读取其他函数内部变量,就创建了一个闭包。

经典二:闭包的优缺点

2.2闭包的优点

1.保护函数内的变量安全
2.在内存中维持一个变量(用的太多就变成了缺点,占内存) ;
3. 逻辑连续,当闭包作为另一个函数调用的参数时,避免你脱离当前逻辑而单独编写额外逻辑。
4. 方便调用上下文的局部变量。
5. 加强封装性,可以达到对变量的保护作用。

2.3闭包的缺点

1.常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。
2.还有有一个非常严重的问题,那就是内存浪费问题,这个内存浪费不仅仅因为它常驻内存,更重要的是,对闭包的使用不当会造成无效内存的产生。

经典三 :使用的闭包注意点

  1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
  2. 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。