首页 > 应用开发 > > 前端程序员必备技能 (闭包精细版)
什么是闭包
闭包就是能“够读取其他函数内部变量的函数”。例如在javascript中,只有函数内部的子函数才能读取局部变量 ,所以闭包可以理解成“定义在一个 函数 内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
简单的来说:闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量
什么情况会产生闭包呢
把里面的函数保存到了外部,必然会产生闭包。
案例1
先说一下执行过程,
1:a函数被定义的时候会产生自己的全局对象 global object。a函数生成是会定义b函数,b函数会拿到a函数的执行期上下文。注意:是b函数定义,不是b函数执行。同理b函数定义的时候也会生成自己的全局对象 global object。
2:a函数执行的时候会产生自己的执行期上下文(如果你不懂执行期上下文,那就该补补课了)。
3:a函数执行完成时销毁自己的执行期上下文,并且返回b函数。
4:b函数被保存到了外部demo里,当执行deme()的时候,b函数同样会生成自己的执行期上下文,b函数里没有c变量,所以找不到。但是在第一步a函数执行时,拿到了a的执行期上下文,顺的作用域链往下找就会从a的作用域链找到c变量,输出结果就是100.
5:为什么b函数能拿到a函数的执行期上下文呢?a函数在执行完成时销毁自己的执行期上下文了呀。打个比方,你有一把车钥匙,我也有一把,同一辆车,你把钥匙扔了,但是车还在,所以b把a的执行期上下文保存下来了。
案例2
这回输出的是几呢?很明显200。是不是又懵了。函数执行会把自己作用域链放在最顶端,查找的时候也是从作用域链最顶端开始的,如果没有就顺的作用域链找,直到找到全局作用域,如果全局都没有,那就会报错,c is not defined。
闭包特性:
函数嵌套函数。
函数内部可以引用外部的参数和变量。
参数和变量不会被垃圾回收机制回收。(就是保存下来了)
让局部变量始终保存在内存中。
当然想理解闭包,首先的了解作用域,作用域链,希望今天的分享可以帮助到一些小伙伴
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69927062/viewspace-3157142/ ,如需转载,请注明出处,否则将追究法律责任。