如何简单的说明javascript的闭包?

jmlu0619 发布于 2014年05月10日
无人欣赏。

javascript新手一枚,最近在看闭包,书上内容有点晦涩,大概知道讲的什么意思,但没法在脑子里形成系统的认识。求大神能帮我茅塞顿开一下

共7条回复
沃尘丰 回复于 2014年05月11日

马克之 同学中

xLi 回复于 2014年05月13日

简单说, 如果函数A里面又定义了函数B, 那B就形成一个闭包. 不论在A之内还是A之外执行B, B都可以访问它被定义的那个上下文(也就是A)中的变量.

ShiningRay 回复于 2014年05月13日

我来举个例子,有个函数(x)-> x+1,这个函数我们称之为纯函数,因为它的函数体中所有变量都可以再自己的声明中找到

而(x)->x+y,则不是纯的,里面包含了一个自由变量y,自由变量不能函数自身内找到定义,那么在函数的执行过程中,就要去寻找它的确切定义

由于JavaScript实现了词法作用域又称静态作用域,所谓词法作用域就是我看代码就能确定自由变量定义在什么地方,比如 (y) -> ( (x) -> x+y ) ,我们就可以立刻知道y是在上一级的函数体中声明的

所谓闭包,也就是词法闭包,就是用来实现词法作用域的数据结构,你可以想象成每个函数都有一个自己的变量表,是从变量名对应值的映射,而这个变量表有个父级指针又指向定义它的函数的变量表,当函数自己找不到自由变量的时候就到父级去找,直到找到为止,那么从自己的变量表到解析到所有自由变量为止的这么个数据结构就是闭包。

flynngao 回复于 2014年05月13日

函数里返回函数,就是闭包

pinxue 回复于 2014年05月13日

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 的路数写的。

董一凡 回复于 2014年05月14日

这种问题真的是不应该提的。伸手党啊

jmlu0619 回复于 2014年05月17日

5楼 @pinxue 谢谢推荐

登录 或者 注册