javaScript---闭包这个小妖精

function books(){
           var book = 12;
           return function(){
          var pen = 2;  console.log(book,pen); } }
var bag = books(); bag();//12,2

一、首先,什么情况下会产生闭包:

  1.执行外层函数

  2.函数嵌套

  3.内层函数引用外层函数的变量/函数

二、闭包的执行过程

  闭包执行的时候,涉及到创建虚拟栈:执行上下文栈,以及创建虚拟作用域链

  1.浏览器拿到这一串代码,先从全局开始,在创建全局变量定义后(var a=10;function b(){},变量声明提前未赋值,给了window),执行全局变量的赋值、函数调用之前,也就是var bag=books();和bag();被执行前,产生了全局执行上下文。

  此时, 全局执行上下文入栈,它的作用域链:当前的全局变量对象(books,bag)

  2.当books函数执行时,从局部,也就是books这个函数开始。创建book变量

  此时,books执行上下文入栈,它的作用域链:books的变量book + 全局变量

  3.当return 的时候,执行了一个匿名函数

  此时,匿名函数执行上下文入栈,它的作用域链:匿名函数的变量pen+books的变量book+全局变量

  需要注意:

  1.此刻的出栈顺序:是找变量的顺序非函数执行顺序

  2.作用域链上的变量、函数,指的是在当前执行上下文中能访问到的变量、或函数

  

  匿名函数执行上下文出栈,它在执行的时候,需要book和pen,但是匿名函数自身是没有book这个变量的,所以它需要往它的上一层找;

  books函数执行上下文出栈,它里面有book变量,好的,可以输出console.log()了。

 

  如有其他理解,欢迎留言交流!!!

posted @ 2022-04-05 17:16  乔十六  阅读(38)  评论(0编辑  收藏  举报