JS闭包

84 阅读1分钟

几个重要的点

闭包是JS的一种语法特性
或者说 JS的所有函数都支持闭包
闭包 = 函数 + 自由变量(他在声明时,可以访问他父级作用域的变量 ->保存在堆内存中,同时堆中还保留了对父级作用域的引用)
当使用一个变量时,会尝试在当前作用域下寻找该变量;向上寻找(不会向下)【也就是产生了作用域链】

举个简单的例子

错误的例子

var count = 0
function add(){
  count += 1 //访问外部变量就一定是闭包了吗?
} 

**注意:**上边说了 自由变量 。你这个 var count = 0是生命在了全局啊!你必须放在非全局环境下

怎么改?

{
  let count = 0 //既不是全局、又不是add()的局部变量,就形成了闭包
  function add(){
    count += 1 
  }
}

当然可以使用立即执行函数来创造【非全局环境】

const add2 = function (){
	var count
	return function add (){ // 访问了外部变量的函数
	  count += 1
	}
}()

能解决什么问题

  1. 我没用全局变量,就不会污染
  2. 提供对局部变量的间接访问(假设 JS 没有闭包,那么函数就不能访问外部的变量)
  3. 维持变量,不会垃圾回收

缺点

  1. 闭包使用不当,内存泄漏(使用不当意思是闭包用错了,并不是闭包会内存泄漏)

开发中很常见的例子

  1. 节流
  2. 防抖
  3. 函数柯里化
  4. ......