回覆列表
  • 1 # 使用者3544811275064

    要理解閉包,首先就是要弄清楚整個程式碼執行過程的每一個細節,到底做了個啥事情。

    所以我們看下count()到底返回了啥

    count()首先定義了一個列表,然後透過一個for迴圈給列表添加了3個元素,最後返回了列表

    所以我們就知道f1,f2,f3分別代表這個列表fs的前三個值fs[0],fs[1],fs[2]

    現在的關鍵就是列表的值到底是啥

    所以我們看下列表中新增的到底是什麼元素,從for迴圈中看出,原來每次都把函式f這個物件新增到了列表中,f只是函式物件的一個引用,這個函式並沒有執行

    因此我們知道,fs列表中存放的,是三個f指向的函式物件(我們暫且稱他為函式f),這個函式f的功能就是返回i*i

    因此,f1,f2,f3分別指向了三個這樣的函式f

    f1(),f2(),f3()就是將這三個函式f分別執行

    現在問題又來了,函式f裡使用到了i這個變數,這個變數來自於函式f定義時的父函式,並沒有來自他本身或者傳入他的引數——內部函式引用外部函式的區域性變數(即使外部函式已經返回),就形成了閉包

    所以這個來自函式f的外部函式的i究竟是什麼?

    當我們執行f1,f2,f3=count()時,count函式內的語句以此被執行,count函式執行完畢,返回fs,f1,f2,f3才等於fs[0],fs[1],fs[2]

    所以f1(),f2(),f3()時,count函式已經執行完畢了,i變數已經經過迴圈,變成3了,現在執行return i*i語句,自然會得到9,9,9

  • 中秋節和大豐收的關聯?
  • 聽說傳祺GM6要換DCT了,這下和大通G50一樣了,該怎麼選?