写文章之前,查阅了很多的资料,也看了很多大牛对闭包的解释,现在总算是对闭包有了一定的理解。
作用域
可能你会问:明明是讲闭包,为什么又讲作用域了? 在理解闭包之前我们首先要明白JavaScript中变量作用域的概念,我们都知道JavaScript的变量分为局部变量和全局变量,比如:
var global = 1;
function f1() {
var local = 2;
console.log(global ) // 1
console.log(local) // 2
}
console.log(global ) // 1
console.log(local) // local is not defined
在上面示例中global是全局变量,因此可以在任何地方访问它,而local是定义在函数f1()中的局部变量,因此只能在f1()中访问。那么如果我们要访问f1()中的local该怎么办呢? 这个时候就需要引入闭包了。
闭包的概念
现在我们来说什么是闭包,我所理解的闭包就是就是可以访问其他函数内部的函数。同样像前面的例子,我们现在就用闭包来实现在函数外部访问local变量
function f1() {
var local = 2;
function bar() {
console.log(local++)
}
return bar
}
var func = f1();
func(); // 2
func(); // 3
这个时候我们相当于通过函数bar()间接的访问到了函数f1()中的局部变量local,因此在func()第一次执行的时候我们得到local=2,但是为什么第二次调用func()得到的local却等于3呢? 按理说我第二次调用func()应该是从f1()中的第一句 var local = 2 开始执行啊。这就涉及闭包的另一个作用了。
闭包的作用
闭包除了能访问函数内部的局部变量,还有一个作用就是将函数内部的变量值储存到内存中。
在上面的示例中,f1()的返回值是bar()函数,我们调用func()的时候其实就是在调用bar(), 而bar()定义在f1内部,是依赖f1()而存在的,因此调用bar时将f1()中的local变量放入了内存中,在第二次调用的时候自然也就从内存中得到了local++后的值。
本文参考文章:http://www.cnblogs.com/cxying... http://www.ruanyifeng.com/blo...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。