在了解闭包之前,我们首先要了解JavaScript的作用域。
JavaScript的作用域可分为全局和局部两种,函数内部可以直接读取全局变量,但是在函数外却不能读取函数内的局部变量。就像一个单向可见的玻璃,玻璃里边的人可以看到玻璃外站的是谁,但是玻璃外却不知道谁在玻璃里看他。
但是有时候我们可能会碰到函数外访问函数内的局部变量的需求,在正常情况下做不到,所以我们通过在函数内定义一个新的函数来实现。
function fun1() {
var n = 999;
nAdd = function() {
console.log('我被执行了');
n += 1;
}
function fun2() {
console.log(n);
}
return fun2;
}
var result = fun1();
我们在fun1中再定义一个fun2函数,由于fun1的n变量相对于fun2可见,因此fun2可以取得变量n,我们此时将fun1的返回值设置为fun2,即返回这个函数,这样我们就通过fun2在fun1外取得了fun1中的局部变量n。
我们在下面调用看一下
result();
nAdd();
result();
下面是控制台输出
从控制台输出我们可以看到我们成功在函数外读取了函数内的局部变量。
这里的函数fun2就是闭包。
总结一下,闭包就是把函数内外连接起来的一座桥梁,JavaScript本身让函数内能够读取函数外,闭包赋予了平等的权利,让函数外也能读取到函数内。
attention:
正常情况下,函数退出后会销毁内部的局部变量,释放内存空间。而使用闭包则不会。另外,闭包可以在外部变更函数内部的值。
请大佬们批评指正。