理解JavaScript中的闭包

/ 前端Javascript / 没有评论 / 484浏览

闭包

闭包是什么

闭包是可以读取其他函数内部变量的函数。 简单理解为,定义在一个函数内部的函数,内部函数持有外部函数内变量的引用。

闭包产生的过程

在函数内部定义的子函数,在函数外部调用子函数时,可以读取函数内部的变量,这个过程就产生了闭包。 闭包有函数+它的词法环境;词法环境指函数创建时可访问的所有变量。

如何在函数外部读取函数内部的局部变量

在JavaScript中只有函数内部的子函数可以在函数外部读取函数内部的变量。 原因是闭包依赖函数中的变量,使函数的变量值始终保持在内存中,不会被垃圾回收机制回收。

闭包的作用

  1. 访问函数内部的局部变量
  2. 让这些变量的值始终保持在内存中
  3. 方便调用上下文的局部变量,利于代码封装

使用闭包的注意事项

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

闭包的使用场景

  1. setTimeout/setInterval 定时器
  2. 回调函数
  3. eventHandle(事件句柄)
  4. 模块化代码(函数+闭包)自执行匿名函数

参考