JavaScript-闭包

一,理解闭包

如何产生闭包?
当嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包.
理解一:闭包是嵌套的内部函数.
理解二:包含被引用变量(函数)的对象.
注意:闭包存在于嵌套函数中.
产生闭包的条件?
1,函数嵌套
2,内部函数引用 了外部函数的数据(变量/函数)
3,调用了外部函数.
4,内部函数执行定义就会产生闭包(定义函数,如果外部不调用,内部函数就没有执行)

// 1,fn1内嵌套了fn2函数
// 2,fn2内使用了name(fn1内定义的变量)
function fn1(){
	let name='lily'
	let age=20
	function fn2(){ // 执行函数定义就会产生闭包(不用调用内部函数)
	console.log(name) // 3,内部函数使用了外部函数变量name
	}
}
fn1() //4,需要调用外部函数才会产生闭包.
  • 闭包可以通过chrome浏览器查看
    在这里插入图片描述

常见闭包

  • 将函数作为另外一个函数的返回值
function fn1(){
	let count=2
	function fn2(){
	count++ 
	console.log(count)
	}
	return fn2
}
let fn=fn1()// 调用fn1
fn() // 3->调用fn2
fn() // 4->调用fn2
 //以上函数只产生了一个闭包(主要看调用了几次外部函数)
  • 将函数作为实参传递给另一个函数调用
//先确定是否是闭包
//1,delayTime函数包含了箭头函数
//2, 箭头函数内使用了
function delayTime(msg,time){
	setTimeout(()=>{
	console.log(msg) // 3,内部函数内使用了外部函数变量msg
	},time)
}
delayTime('showTime',1000) //4,调用了外部函数

闭包的作用

1,使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)
2,让函数外部可以操作(读写)到函数内部的数据(变量/函数)

闭包的生命周期

1,产生:在嵌套内部函数定义执行完成时就产生了闭包(不是调用)
2,死亡:在嵌套的内部函数称为垃圾对象时.

function fn1(){
	let count=2
	function fn2(){
	count++ 
	console.log(count)
	}
	return fn2
}
//1,函数执行完成之后,函数内部声明对的局部变量是否存在?-->一般不存在,存在于闭包中的变量才有可能存在
// 2,在函数外部能直接访问函数内部的局部变量吗?-->不能,但是我们可以通过闭包让外部操作
let fn=fn1()// 调用fn1之后count仍然存在,内存中没有释放, fn2本身不在了,但是fn指向了fn2也会在内存中
//如果上个语句不使用变量fn存fn(),那么函数调用结束之后,函数就称为垃圾对象.闭包也就消失
fn() // 3->调用fn2
fn() // 4->调用fn2
 //以上函数只产生了一个闭包(主要看调用了几次外部函数)

内存溢出与内存泄漏

  • 闭包的缺点
    1,函数执行完 后,函数内的局部变量没有释放,占用内存时间会变长
    2,容易造成内存泄漏
  • 解决
    1,能不用闭包就不用
    2,及时释放内存
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值