什么是闭包?
每个函数在创建时都有一个与之对应的执行环境,每个执行环境有一个相关联的变量对象保存在内存中,变量对象中保存的是当前函数中定义的变量和函数。
当程序的执行流进入到函数时,就会将函数的执行环境压入到环境栈中,还会生成一个作用域链,作用域链指向的就是一系列变量对象,保证程序对变量的有序访问。
正常来说,当一个函数执行完毕,执行环境就会被弹出,其他地方没有办法访问到这个函数对应的变量对象,但是有一种情况例外,就是闭包。
闭包中虽然函数的执行环境被弹出,但是程序中仍然保有对该函数的变量对象的引用,因此在函数外仍然可以访问这个函数的内部定义的变量,这种情况就叫闭包。
闭包的应用场景
- 使用闭包代替全局变量
我们经常小范围的使用全局变量,这个时候可以使用闭包来代替。 - 函数外或在其他函数中访问某一函数内部的参数
为了解决在Ajax callback回调函数中经常需要继续使用主调函数的某一些参数 - 在函数执行之前为要执行的函数提供具体参数。
比如setTimeOut,onreadyStateChange = function(){},里面不能传递参数,可以使用闭包 - 在函数执行之前为函数提供只有在函数执行或引用时才能知道的具体参数。
- 为节点循环绑定click事件,在事件函数中使用当次循环的值或节点,而不是最后一次循环的值或节点
- 暂停执行
- 包装相关功能