定义中含有自由变量的函数叫闭包。运行时自由变量通过作用域链进行查找。根据语言作用域机制的不同(词法/静态作用域或动态作用域),自由变量会绑定到定义时环境(词法作用域)或者运行时环境(动态作用域)。大部分语言都是词法作用域,例如Python、JavaScript 可以看看这个词法作用域和动态作用域
闭包是在Js流行后才真正流行起来的。它很可能造成内存泄露,理解起来也很费劲。它在JS中的一个作用是局部变量驻留内存,即原来一个局部变量会随着函数的退出被系统清除,而使用了闭包就会让这个变量驻留在内存中。通常当内部函数访问外部函数的变量时,就形成了闭包,也即词法作用域的问题。比如有: function warp(){ var a=10; return function(){ a=a+1; } } 在上面这个例子中,变量a就常驻内存,但和全局变量又有不同,它只能在warp的作用域中访问。
函数是一个馒头,闭包是一个有馅(自由变量)的包子。函数一眼看穿,包子不咬下去不知道什么味。
松本行弘对闭包的解释:闭包和对象都是“数据与过程的结合”,对象是在数据中以方法的形式内含了过程,闭包则是在过程中以环境的形式内含了数据。
名字空间与函数捆绑后的结果被称为一个闭包(closure)
一般变量的搜索顺序是
LGB
, 而在闭包中是LEGB
这个 E 就是被函数捆绑在一起的名字空间.定义中含有自由变量的函数叫闭包。运行时自由变量通过作用域链进行查找。根据语言作用域机制的不同(词法/静态作用域或动态作用域),自由变量会绑定到定义时环境(词法作用域)或者运行时环境(动态作用域)。大部分语言都是词法作用域,例如Python、JavaScript
可以看看这个
词法作用域和动态作用域
个人理解的闭包,不过是用JS写的,就是和 Python 语法不太相同。
http://zonxin.github.io/post/...
词法作用域。。。
闭包是在Js流行后才真正流行起来的。它很可能造成内存泄露,理解起来也很费劲。它在JS中的一个作用是局部变量驻留内存,即原来一个局部变量会随着函数的退出被系统清除,而使用了闭包就会让这个变量驻留在内存中。
通常当内部函数访问外部函数的变量时,就形成了闭包,也即词法作用域的问题。比如有:
在上面这个例子中,变量a就常驻内存,但和全局变量又有不同,它只能在warp的作用域中访问。
高阶函数