闭包的概念
如果一个函数访问了此函数的父级及父级以上的作用域变量,那么这个函数就是一个闭包。
所以以下写法都是闭包

本质上,JS中的每个函数都是一个闭包,因为每个函数都可以访问全局变量。
实现闭包最常见的方式就是函数嵌套(并不是形成闭包的唯一方式!)

闭包的执行过程
以上方代码为例:
将函数a赋值给全局变量c时,a会执行一次,局部变量 i 的值变为初始值—_执行a,最终返回函数b,此时全局变量c的值为闭包函数b的引用。
此时函数a虽然已执行完,但因为内部包含闭包函数b,所以函数 a 的执行期上下文会继续保留在内存中,不会被销毁,所以局部变量 i 仍是初始值—_执行a
执行期上下文:当函数执行时,会创建一个执行期上下文的内部对象。每调用一次函数,就会创建一个新的上下文对象,他们之间是相互独立的。当函数执行完毕,它所产生的执行期上下文会被销毁
第一次执行 c() 时,闭包函数b第一次执行,局部变量 i 的值变为初始值—_执行a_执行b
第二次执行 c() 时,闭包函数b第二次执行,局部变量 i 的值变为初始值—_执行a_执行b_执行b
闭包的用途
访问函数内部的变量
让变量始终保持在内存中