假設起點從x=0
開始。
走了3
步,列印的結果result = 3
再走了5
步,列印的結果是result = 8
又走了6
步,列印的結果是result = 14
先用非閉包函式實現:
x = 0
defgo
(step):
global x
new_pos = x + step
x = new_pos
return x
print(go(3))
print(go(5))
print(go(6))
---------------------------------------------
輸出:3
814
這裡為什麼要用global
關鍵字來定義變數x
為全域性變數呢?這是因為`在go
函式內部出現了x = new_pos
,而python
會認為等號左邊的變數是乙個區域性變數。如果沒有使用global
關鍵字來定義x
為全域性變數的話,new_pos = x + step
這行是會報錯的。就會未定義x
變數。
在函式內部定義乙個全域性變數這個做法是不好的,因為全域性變數是很容易被其他函式改變的。現在用閉包來實現
origin = 0
deffactory
(pos):
defgo
(step):
nonlocal pos
new_pos = pos +step
pos = new_pos
return new_pos
return go
f = factory(origin)
print(f(3))
print(f(5))
print(f(6))
----------------------------------
輸出:3
814
注意,用了nonlocal
關鍵字來宣告pos
變數不是本地的乙個區域性變數。閉包的環境變數有儲存現場的乙個功能,它可以記憶上一次呼叫的狀態。
定義的變數
origin
的變數並沒有被改變。
閉包 解決閉包問題
1 函式和對其周圍狀態 lexical environment,詞法環境 的引用 在一起構成閉包 closure 2 函式與函式所依賴的上下文環境組成閉包問題。3 閉包指的是 能夠訪問另乙個函式作用域的變數的函式。清晰的講 閉包就是乙個函式,這個函式能夠訪問其他函式的作用域中的變數。var arr ...
用陣列理解閉包
閉包 乙個函式可以把自己內部的語句,和自己宣告時所處的作用域封裝在乙個密閉的環境中 函式在定義時,能夠記住自己函式體以及所處的外部環境 每個函式都是閉包,每個函式天生能記住自己定義時所處的作用域環境。這是乙個陣列,陣列中有10個函式,目的 想要輸出函式的角標,也就是說arr 0 彈出0 arr 2 ...
js閉包問題以及解決辦法
個人理解閉包的產生主要就是 一切最外部的函式比裡面的函式先執行,必然產生閉包,閉包會導致原有的作用域鏈不釋放,造成記憶體洩漏 解析 實現上現在的demo儲存的是function b a執行之後就銷魂了自身的ao,但是此時b已經儲存了a的ao 解析 為什麼可以列印出123?因為函式內部的b函式並沒有執...