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()了。
如有其他理解,欢迎留言交流!!!