js闭包

什么是闭包?

在一个函数作用域中 保留 它上级作用域的局部变量,这些局部变量不会随着上级函数的执行完毕而被销毁

简单的理解闭包:子函数可以使用父函数的局部变量(包括参数,因为参数也是局部变量);


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;
	}
}

怎么样才能形成闭包?

在有函数嵌套的情况下,子函数用到了父函数的参数或者局部变量,一般都会形成闭包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值