首页 > 代码库 > 闭包——抽象解释的简单注释
闭包——抽象解释的简单注释
总是听说闭包是脚本语言中最难以理解的东西,今天我抽时间对闭包做一个解释,下面是一段百度对闭包的解释:
闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。在 Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python和Lua,objective c 等语言中都能找到对闭包不同程度的支持。
事实上百度已经解释的十分清楚了 ,我仅仅是将这一段概念做一个注解。我们通常所谓的闭包函数到底是怎么样子的?首先作为一个函数,它的形式一定时一个函数的形式:
function(){ ...... }
其次这个函数内部包含的 是一个变量,而这个变量和对象的变量无关。这样形成了一个含有变量的代码块。你也许会说我擦,这不就是个函数嘛!?别着急对这个函数还有一些特殊的要求:我们要求这个变量不属于代码块,不属于全局变量,而是一个环境变量var,我去,这越来越像一个普通函数了,其实仔细想想没错啊,闭包函数本来就是个函数啊。
不过我们这个时候更应该想到的是脚本的运行机制,通常来书脚本函数在运行之后会释放自己的内存,也就是说每个函数执行完成后,这个函数里的变量就会消失不见,闭包函数就是为了解决这个问题而存在的。闭包要求这个变量不能消失,就是说局部变量是静态的。我该怎么办呢?下面我把这个函数的定义图和实现方法表示出来:
1 2 3 4 5 6 7 | function (){ var 不属于代码块,不是全局变量 } function f1(){ function f2(){闭包变量的位置} return f2; } |
这张蓝色的图片表示闭包函数调用的一个过程。这下我们拥有了一个永恒存在的变量,我可以在各个地方调用它,是不是方便了很多呢?至于具体怎么应用那就是你的事情了。