闭包原理

js 闭包原理
闭包的定义:闭包是指有权访问另一个函数作用域中的变量的函数 --《JavaScript 高级程序设计》。

如何理解这句话:其实就是指在函数a外面能够访问函数a里面的函数b。

例如:

复制代码
function a () {
var v = 123;
function b() {
console.log(v);
}
return b;
}

var b = a();
b(); // 123
复制代码
执行函数a时把函数b返回,此时函数b就保存到了a的外面,这时候就可以在a函数的外部对b进行访问。

相关知识点:js作用域链

执行原理:

1、首先在预编译全局代码时,生成GO

GO {

a: function a() {…},

b: undefined

}

2、执行 var b = a(); 此时对a函数进行预编译并创建a 函数的AO

AO {

v: undefined,

a: undefined,

b: function b() {…}

}

3、创建a函数的作用域链

a.[[Scopes]] = [AO, GO];

4、由于函数的提升,会在a函数进行预编译的时候创建b函数的AO

b AO {}

b.[[Scopes]] = [AO(b), AO(a), GO]

5、执行 var v = 123; 在js预编译中提到由于var v 的声明已经得到了提升,所以此时只执行v = 123;对AO里的v 进行赋值。

AO {

v: 123,

a: undefined,

b: function b() {…}

}

6、之后将函数b返回,此时a函数执行完毕,a函数对应的AO理应销毁,但是由于在b函数中又对a函数的AO中的变量进行应用,所以a函数的AO不能被垃圾回收机制销毁,但是会跟a函数断开联系,当a函数再次执行,会重新创建一个a函数的AO。

7、在全局变量中使用b 接收函数a的返回,此时GO变为

GO {

a: function a() {…},

b: function b() {…}

}

8、全局里的b

在b函数中打印v变量,由于b函数的AO中没有v变量,所以顺着作用域链往上找,在a的AO中找到v并打印。

闭包优缺点:

优点:

1、属性的私有化,在b返回后,处理b函数中能对v进行操作,其它地方都不能对v进行操作。

2、防止变量污染。

缺点:

容易造成内存泄漏,因为如果后期不对全局中的b进行处理(例如:赋值为null),a函数的AO 会一直存在于内存中,如果多次调用a函数,容易导致内存中的垃圾数据越来越多造成内存泄漏。

好文要顶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值