javaScript---閉包這個小妖精
阿新 • • 發佈:2022-04-05
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()了。
如有其他理解,歡迎留言交流!!!
搜尋
複製