闭包是什么
2015-12-07 本文已影响78人
bruce_wu
以前听说过闭包也简单的了解过,一直以为闭包就是可以将函数作为对象或参数使用。
最近看书又看到关于这块的概念发现并非如此,所以就较真详细了解了一下闭包的概念。
有一些编程语言(如: javascrpt)中提供了函数对象的概念,有些人包括我认为这个就叫做闭包,其实这是不准确的。
- 概念
下面我查询了解了一下闭包的概念
1、闭包是指函数有自由独立的变量。换句话说,定义在闭包中的函数可以“记忆”它创建时候的环境。
2、在函数对象中,将局部变量及其环境封闭起来的结构被称为闭包。
-
代码
例如如下js代码:function extent() { var n=0; return function() { n++; console.log("n="+n); } } f =extent(); f(); //n的值为1 f(); //n的值为2
如上代码,将带有 n 这个变量和环境封闭起来并可以供外部使用的结构就是闭包。
-
Ruby中的闭包
其实在ruby中我们经常使用闭包,例如如下
sum = 0
10.times{|n| sum += n}
print sum
10.times 表示调用对象10的 times 方法,紧跟在这个调用后面的大括号里面的部分就是Block。Block 实际上就是匿名函数,它可以被调用,可以捕获上下文。因此上面的代码已经使用了闭包。 -
应用场景
1、保护函数内的变量安全。以最开始的JS为例,函数extent中n只有通过函数f才能访问,而无法通过其他途径访问到,因此保护了n的安全性。
2、在内存中维持一个变量。如上JS,由于闭包,函数extent中n的一直存在于内存中,因此每次执行f(),都会给n自加1。 -
使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成性能问题
2)闭包会在父函数外部,改变父函数内部变量的值。所以,一定要小心,不要随便改变父函数内部变量的值。