要理解閉包,首先就是要弄清楚整個程式碼執行過程的每一個細節,到底做了個啥事情。
所以我們看下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
要理解閉包,首先就是要弄清楚整個程式碼執行過程的每一個細節,到底做了個啥事情。
所以我們看下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