我来举个例子,有个函数(x)-> x+1,这个函数我们称之为纯函数,因为它的函数体中所有变量都可以再自己的声明中找到
而(x)->x+y,则不是纯的,里面包含了一个自由变量y,自由变量不能函数自身内找到定义,那么在函数的执行过程中,就要去寻找它的确切定义
由于JavaScript实现了词法作用域又称静态作用域,所谓词法作用域就是我看代码就能确定自由变量定义在什么地方,比如 (y) -> ( (x) -> x+y ) ,我们就可以立刻知道y是在上一级的函数体中声明的
所谓闭包,也就是词法闭包,就是用来实现词法作用域的数据结构,你可以想象成每个函数都有一个自己的变量表,是从变量名对应值的映射,而这个变量表有个父级指针又指向定义它的函数的变量表,当函数自己找不到自由变量的时候就到父级去找,直到找到为止,那么从自己的变量表到解析到所有自由变量为止的这么个数据结构就是闭包。
In a nutshell, a closure stores function state, even after the function has returned. To create a closure, simply define a function inside another function and expose it. To expose a function, return it, or pass it to another function. The inner function will have access to the variables declared in the outer function. This technique is commonly used to give objects data privacy.
Chapter2, Programming Javascript Applications
这本书写得非常好,真正是照着 Moden Javscript 的路数写的。