简简单单的学会闭包

13 篇文章 0 订阅

闭包就是fn2,能读取其他函数内部变量的函数(定义在函数内部的函数)

var a = 123;
var fn1 function(){
	var b = 234
	function fn2(){
		console.log(b)
	}
	return fn2
}
var res = fn1()
res()

闭包特点:闭包就是函数内部跟函数外部链接的一座桥梁

用途:可以做一个计数器
作用:读取函数内部的变量,这些变量始终在内存当中
因为inc变量不会被销毁,inc又是b(),所以b()中的start变量不会销毁

function a(){
	var start=0
	function b(){
		return start++;
	}
	return b
}
var inc= a()
console.log(inc())//inc就相当于b()方法
inc=null//释放内存

立即执行函数(IIFE)
立即执行函数:定义函数之后,立即调用该函数
(function (){})()//第一个大括号相当于是一个表达式,表达式的内容是里面的。如果不加的话,会报错,因为在js中行首是function的时候是表示函数的声明,一定要有函数名的,注意:在立即执行函数的后面一定要加‘;’不然会报错,因为()当中不知道你什么时候结束

缺陷
闭包的缺点就是增大内存使用量,
使用不当很容易造成内存泄露。
否则会造成网页的性能问题
不要随便改变父函数内部变量的值,
好处
避免污染全局变量

我个人认为,闭包是:外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象,这就是闭包的重要概念
销毁就是在内存中清除了,访问不到

闭包的使用场景:
在之前用过var循环赋值的(立即执行函数)

什么是闭包
闭包是指有权访问另外一个函数作用域中的变量的函数。
闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。闭包就是就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配。当在一个函数内定义另外一个函数就会产生闭包。

(2)为什么要用:

匿名自执行函数:我们知道所有的变量,如果不加上var关键字,则默认的会添加到全局对象的属性上去,这样的临时变量加入全局对象有很多坏处,比如:别的函数可能误用这些变量;造成全局对象过于庞大,影响访问速度(因为变量的取值是需要从原型链上遍历的)。除了每次使用变量都是用var关键字外,我们在实际情况下经常遇到这样一种情况,即有的函数只需要执行一次,其内部变量无需维护,可以用闭包。

结果缓存:我们开发中会碰到很多情况,设想我们有一个处理过程很耗时的函数对象,每次调用都会花费很长时间,那么我们就需要将计算出来的值存储起来,当调用这个函数的时候,首先在缓存中查找,如果找不到,则进行计算,然后更新缓存并返回值,如果找到了,直接返回查找到的值即可。闭包正是可以做到这一点,因为它不会释放外部的引用,从而函数内部的值可以得以保留。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值