什么是闭包?
在一个函数作用域中 保留 它上级作用域的局部变量,这些局部变量不会随着上级函数的执行完毕而被销毁
简单的理解闭包:子函数可以使用父函数的局部变量(包括参数,因为参数也是局部变量);
function test() {
var i=0;
function b() {
alert(++i);
}
return b;
}
var c= test();
c();
闭包是和JS的垃圾回收机制相关的,正常来说在test()函数调用完毕后,为局部变量i分配的空间就会被回收了. 但是这里在test函数里又定义了一个子函数b,并且在函数b的里面用到了 上级函数的局部变量i,然后在test()里return b. 这样一来就会导致:
当test()函数调用完毕,为局部变量i分配的空间也不会被收回。
所以在var c= test();这句执行完毕后,调用c()依然可以访问到局部变量i,所以就弹出了1.
function parent(num1) {
var num2= 10;
return function child() {
alert(num1+num2);
}
}
var fun = parent(10);
fun();
在parent函数内部返回值也是一个函数,在return的这个child()函数里,用到了parent函数的参数num1和局部变量num2,因为形成了闭包,所以调用fun()的时候就可以访问到num1和num2.所以就弹出20了.
var name = 'zj';
var obj = {
name:'z3',
getName:function () {
return function () {
return this.name;
}
}
}
alert(obj.getName()());// 弹出zj
为什么会弹出zj?
先把alert里内容改成alert(obj.getName);看一下
直接alert(obj.getName)就相当于调用obj这个对象下的getName属性,弹出getName这个属性的值,所以弹出是一大段代码接着改写成alert(obj.getName( ) ),看下结果
直接alert(obj.getName( ) )就相当于直接执下面的代码:
function () {
return function () {
return this.name;
}
}
怎么样才能形成闭包?
在有函数嵌套的情况下,子函数用到了父函数的参数或者局部变量,一般都会形成闭包。