闭包

什么是闭包?

  1. 一个普通的函数,如果可以访问外层作用域的变量,那么这就是一个闭包

  2. 广义的角度上: JS的函数都是闭包
    狭义的角度上: JS中的一个函数,内部引用了外部作用域的变量,那就是闭包

function foo( param = 1 ){
  return function(){
    return param += 1
  }
}
  1. 闭包的内存泄漏
    原因: 因为闭包函数存在就会一直引用着父级函数的作用域中内存,如果只是调用了一次闭包函数并且不进行销毁,那么父级作用域会被一直引用着占据内存,从而形成内存泄漏
    解决: 将父级函数指向null进行销毁或者将接收闭包函数的变量指向null进行销毁

    function foo( param = 1 ){
      return function(){
        return param += 1
      }
    }
    let add = foo()
    foo = null
    add = null
  2. 如果父级作用域有着闭包函数不需要的变量该如何处理?
    (1) 老版本的JS引擎会将不需要的变量也进行保留
    (2) 新版本的JS引擎(V8)会将不需要的变量进行删除


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!