1. 程式人生 > 其它 >javaScript---閉包這個小妖精

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()了。

 

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

搜尋

複製