js闭包

1,说到js的闭包,我想必须要从变量的作用域讲起,在一个函数中定义一个局部变量,在函数外是无法访问的,这是因为当函数执行完之后,这个局部变量就被释放啦,不存在内存中。只要我们想办法不让这个变量被回收就好。

说到这,先说下什么是闭包,我觉得可以简单的理解成,是在一个函数中A嵌套了另一个函数B,这就形成了一个闭包:


回到刚才的问题,如果你想在函数A之外,读取其内部的局部变量a那是不行的,但是函数A里面的函数B就可以做到,所以你只要将函数B返回就好:


在这个例子中,A函数执行完之后,其内部的局部变量a并没有被释放,这是因为它的子函数B赋给了一个全局变量,所以B会一直存在内存中,B是依赖A的,所以A也不能被释放。


2,下面再说一个闭包自执行函数的例子:

有是个p标签,点击其中的某个输出它的索引值,也许有人会这样写:


但是这样的话,无论你点击哪一个p标签,都是输出10。我的理解是这样的,你给每个p标签的点击事件绑定了一个函数,但是这个函数并还没有执行,所以这个闭包函数里面的变量i并没有被正真赋值,或者说只是对函数外的变量i的一个应引用,而当你点击p标签,去正真执行这个闭包函数时,这时for循环已经执行完,此时i的值是为10,也就是此时这个闭函数里面的i变量才会被正真的赋予值,所以是10;js改进如下:


此时每个p标签绑定的是一个自执行函数,并且向这个函数传了一个值,而这个自执行函数会立马执行,并且把值传给了自执行函数里面的变量j,而因为这个自执行函数返回的是个函数,它此时不会被垃圾机制回收,所以这个j变量不会从内存中释放,这个状态就会被记录下来。所以但你点击不同的p标签时,他就会输出不同的索引值。

你可以简单理解成,此时p标签绑定的函数已经执行完,所以里面的变量已经被赋值。


3,有关this作用域的例子

看这两个函数:



第一段代码输出11,第二段的输出10,其实也不难理解。第二段代码中当你执行obj.fun()的时候返回的是一个函数,而此时这个函数已经不属于obj之下的啦,他是暴露在全局作用域之下的,所以此时这个this应该是的是window。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值