这次保证将JS中的闭包给你讲明白!

在给大家介绍闭包前,首先先介绍两个定义,即作用域和环境。
我举一个简单的例子,通过这个例子我想大家会有一个更为直观的概念。
比如:我们生活的城市、乡村、草原、沙漠等等这些属于现实生活中的环境,这是毋庸置疑的。那么作用域呢,比如北京市,它是有一个区间范围的,超过了这个范围就不再属于它管辖。
在此基础上,大家进行类比分析,也会发现,实际上计算机上面的代码环境也就是包含一些变量啦,函数啦等等,那么作用域呢,也就是这个环境所能管辖、涉及到的范围。
例如:

function test(){
var n = 0;
return function a(){
console.log(n);
}
}

test 的中的环境包含 n和a()函数。那么其作用域就是test中括号里面所对应的范围。

闭包

理解完上面的两个概念,再说一下闭包。闭包的定义大家可以背一下,面试的时候经常考到。
闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。
还拿上面这个函数

function test(){
var n = 0;
return function a(){
console.log(n);
}
}

这个函数中a()函数可以访问到test()中定义的n变量。此种情况称为闭包。

闭包的弊端

function test(){
var n = 0;
var m= 1return function a(){
console.log(++n);
}
}
let b = test();
b();
b();
result:1,2

这个例子正是利用了闭包作用,并且应征了一句话:js中的垃圾回收机制是不再被调用的变量将会被回收,相反将被调用的函数会一直存在。因为m变量一直保存在内存中,因为子函数老是调用n,造成父级环境会一直存在,从而使m变量也一直存在。这样的话会造成内存泄露,说白了就是会增大无用内存。

批注:

1、js中的作用域分为:函数作用域和块级作用域(es6)提出的
函数作用域顾名思义就是函数中存在的作用范围。块级作用域就是‘{ }’中包含的范围。
2、js中的垃圾回收机制是不再被调用的变量将会被回收,相反将被调用的函数会一直存在。
3、this指向问题。(setTimeout函数、箭头函数、let等尤其注意这三个类型)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值