閉包 ———— 個人理解簡述 閉包在某種含義上其本身其實也是一個函數。 定義的格式簡單來說為在一個函數內部再創建一個函數, 也就是一個外函數包裹了一個內函數, 在內函數里使用了外函數的臨時變數, 外函數的“return”返回值為內函數的引用(函數名)。 在形式上與迴圈嵌套有些相似, 暫且也可稱之為函 ...
閉包
———— 個人理解簡述
閉包在某種含義上其本身其實也是一個函數。
定義的格式簡單來說為在一個函數內部再創建一個函數,
也就是一個外函數包裹了一個內函數,
在內函數里使用了外函數的臨時變數,
外函數的“return”返回值為內函數的引用(函數名)。
在形式上與迴圈嵌套有些相似,
暫且也可稱之為函數嵌套。
閉包的使用可以有效的隱藏函數內部的工作細節,
只給外部使用者提供一個可以執行的內部函數的應用。
如果在外函數里自定義了變數並且需要在內函數中對其進行修改,
需要將變數聲明為 “nonlocal” ,nonlocal 聲明變數為非本地變數,
如果確定在程式要修改外部變數,那麼建議將 nonlocal 寫在內部函數的第一行。
舉個慄子:
如圖:
在這段代碼中,在實際開發中並沒有實際意義,只是簡單示意了函數可以被當做參數和返回值使用。
有兩點需要註意:
1> 儘量不要使用全局變數,因為全局變數會破壞程式的封裝性。
2> 如果 show 函數不想被 callFunc 以外的函數進行訪問時,是無法控制的
基於以上兩點,圖中代碼可以進行優化修改:
代碼進行優化後,去不再使用全局變數。而且將 show 函數封裝在了 callFunc 函數內部,使外部不可見,不能使用 show 函數,隱藏了實現細節
程式在執行時,callFunc 函數返回了內部定義的 show 函數,並且 在 show 函數內部使用了外部函數的變數。
在 show 函數返回時,保存了當前的執行環境,也就是會在 show 函數中使用的外部變數 n 。
因為 n 是一個 callFunc 函數中的局部變數,正常情況下 callFunc 函數執行結束後,n 就會被釋放。
但是現在因為 callFunc 函數中返回了 show 函數,show 函數在外部還會再執行,所以程式會將 show 函數所需的執行環境保存下來。
水平一般,能力有限,如有不足,加以改正。