误解:JS闭包的本质是在函数内部访问函数外部的变量。(×)
例1:
var n=1;
function test(){
alert(n);
}
test(); //1
上述例子并不属于JS闭包,以上属于JS的特性:在函数内部可以直接读取全局变量。但是!!!在函数外部无法访问到函数内部定义的局部变量。
例2:
function test(){
var n=1;
}
alert(n); //ReferenceError: n is not defined
为了访问到函数1内部的局部变量,可以在函数1内部再定义一个函数2,通过函数2访问函数1内部的变量,最后返回。
例3:
function test(){
var n=1;
function closure(){
alert(n);
}
return closure;
}
var t=test();
t(); //1
例3中通过closure()函数访问test()函数内部的局部变量,此处的closure()函数就是闭包。
闭包的本质可以理解为:能够读取其他函数内部变量的函数。
闭包是“定义在一个函数内部的函数”。
闭包起到连接函数内部与函数外部的桥梁作用。