学习闭包之前首先需要了解的是变量的作用域主要是全局变量和局部变量
1.在于函数内部可以直接读取全局变量。
2.在函数外部不能直接读取局部变量
需要注意的是函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量。
举例说明:
<
script
>
function f1() {
var n =
999;
function f2() {
alert(n);
}
return f2;
}
var result = f1();
result();
// 999
<
/
script
>
函数f2被包含在函数f1内部,函数f1内部的的所有局部变量,对函数f2都是可见的,但是反过来就不行,在上述函数中,函数f2可以访问到f1的局部变量,只需要将函数f2作为返回值,我们就可以在函数f1外部读取到它的内部变量。
什么 是闭包 :闭包就是能够读取其他函数内部变量的函数。
<
script
>
function f1(){
var n=
999;
nAdd=
function(){n+=
1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result();
// 999
nAdd();
result();
// 1000
<
/
script
>
上述其实result实际上就是闭包f2函数,他一共执行了2次,第一次是999,第二次是1000,这证明了函数f1中的局部变量n一直被保存在内存中,并没有在f1调用之后自动被清楚。f1函数是f2函数的父函数,f2被赋予了一个全局变量,导致f2始终存在于内存中,而f2的存在一脸于f1,因此f1也实证存在内存中不会再调用结束之后被垃圾回收机制回收。
<
script
>
function f1(){
var n=
999;
nAdd=
function(){n+=
1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result();
// 999
nAdd();
result();
// 1000
<
/
script
>
另外注意的是
nAdd=function(){n+=1}前面没var关键字,因此nAdd是一个全局变量不是局部变量,nAdd的值一匿名函数(,匿名函数就是没有实际名字的函数),而匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。