ITPub博客

首页 > 应用开发 > > 前端程序员必备技能 (闭包精细版)

前端程序员必备技能 (闭包精细版)

作者:u_509a2a8fdb46 时间:2019-08-12 11:58:08 0 删除 编辑

什么是闭包

闭包就是能“够读取其他函数内部变量的函数”。例如在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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-08

  • 博文量
    210
  • 访问量
    38