什么是闭包,在了解闭包之前我们需要先了解
词法作用域。因为闭包是基于词法作用域书写代码时产生的自然结果。
什么是词法作用域?
- 作用域相信大家都不陌生,在js中,作用域就是一套规则,这套规则用来管理引擎如何在当前域以及嵌套的子域中根据标识符进行变量查找。
- 词法作用域并不是我们我们经常说的
函数作用域,全局作用域,块级作用域,作用域主要有两种工作模式,,词法作用域是作用域的其中一种工作模式,还有一种叫动态作用域。这些在《你不知道的JavaScript》上卷一、二章有提到。JavaScript采用的模型就是词法作用域。
闭包?
- 作用域是由JS代码书写位置来决定的,函数可以记住并访问所在词法作用域,就会产生闭包,即使函数是在当前作用域外执行。
对闭包的理解
- 执行上下文其实就是执行环境(全局环境,函数环境,eval环境)
- 在js代码执行时就会创建一个全局执行上下文,并且推入执行栈,当执行过程中遇到到函数就创建函数执行上下文,同样的,也会推入执行栈,以此类推,当函数内还有函数也同样会创建函数执行上下文并继续推入执行栈。当最内层执行上下文内的代码执行完毕就会被弹出栈,以此类推。
- 在创建执行上下文时,也会创建一个作用域链,作用域链包含了当前作用域所有查找对象以及父级查找对象。所以在查找对象时会先从自身查找,再依次向上查找。这样其实就是内存环境只能访问外层环境。而闭包恰好打破这样的规则,内层函数作用域链包含外层函数作用域对象,并且内层函数被引用,因此内层函数不会执行完成后被释放,并且内层函数保留了对外层函数作用域的引用,此时就形成了闭包!