JavaScript闭包

	作用域链就是一层一层往上找,直到找到全局作用域还没有,就宣布放弃,这一层一层的关系就叫作用域链。
 闭包会导致作用域链问题,“函数套函数,内层函数对外层函数变量的引用”。
 let name = 'ao'
   let obj = {
	   name:'bo',
	   method:function(){
		   // let _this = this 将this指向当前对象
		   return function(){
			   return this.name
		   }
	   }
   }
   console.log(obj.method()())   //ao

/*
在调用obj.method()函数时,会返回一个匿名函数,而匿名函数返回的是this.name 用到了this属性,
在匿名函数当中,this相当于一个外部变量,所以会形成闭包。
在JavaScript中,this指向函数调用的实体,而匿名函数的实体全是全局的window,因此输出的 是’ao’
如果想要输出obj中的’bo’,就要改变this的指向。将其指向this对象本身

闭包如果使用和理,在一定程度上能够提高代码的执行效率,如果不和理就会造成内存浪费,性能下降

优点:1.保护函数内部变量的安全,实现封装,防止变量流入其他环境发生命名冲突,造成环境濡染
	  2.可以在内存中维护变量并缓存(使变量不被垃圾回收机制回收),提高执行效率
缺点:1. 消耗内存,函数的活动对象会随着执行上下文环境一起销毁,但是由于闭包引用的是外部函数的活动对象,
	   因此这个活动对象无法被销毁,这就意味着闭包逼普通函数要消耗更多的内存
	  2. 在ie9 之前,如果闭包中引用了DOM对象,则意味着DOM对象无法被销毁,则会造成内存泄漏
*/
 function dom() {
	   let ele = document.getElementById('ele')
	   ele.onclick = function(){
		   console.log(ele)
	   }
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值