vue.config.js常用配置詳解
阿新 • • 發佈:2022-01-29
閉包——裝飾器的本質也是閉包
“閉包”的本質就是函式的巢狀定義,即在函式內部再定義函式,如下所示。
“閉包”有兩種不同的方式,第一種是在函式內部就“直接呼叫了”;第二種是“返回一個函式名稱”。
(1)第一種形式——直接呼叫
def Maker(name): num=100 def func1(weight,height,age): weight+=1 height+=1 age+=1 print(name,weight,height,age) func1(100,200,300) #在內部就直接呼叫“內部函式” Maker('feifei') #呼叫外部函式,輸出 feifei 101 201 301
(2)第二種形式——返回函式名稱
def Maker(name):
num=100
def func1(weight,height,age):
weight+=1
height+=1
age+=1
print(name,weight,height,age)
return func1 #此處不直接呼叫,而是返回函式名稱(Python中一切皆物件)
maker=Maker('feifei') #呼叫包裝器
maker(100,200,300) #呼叫內部函式
(3)“閉包”的作用——儲存函式的狀態資訊,使函式的區域性變數資訊依然可以儲存下來,如下。
def Maker(step): #包裝器 num=1 def fun1(): #內部函式 nonlocal num #nonlocal關鍵字的作用和前面的local是一樣的,如果不使用該關鍵字,則不能再內部函式改變“外部變數”的值 num=num+step #改變外部變數的值(如果只是訪問外部變數,則不需要適用nonlocal) print(num) return fun1 #=====================================# j=1 func2=Maker(3) #呼叫外部包裝器 while(j<5): func2() #呼叫內部函式4次 輸出的結果是 4、7、10、13 j+=1
從上面的例子可以看出,外部裝飾器函式的區域性變數num=1、以及呼叫裝飾器Maker(3)時候傳入的引數step=3都被記憶了下來,所以才有1+3=4、4+3=7、7+3=10、10+3=13.
從這裡可以看出,Maker函式雖然呼叫了,但是它的區域性變數資訊卻被儲存了下來,這就是“閉包”的最大的作用——儲存區域性資訊不被銷燬。
nonlocal關鍵字的作用
該關鍵字的作用和local的作用類似,就是讓“內部函式”可以修改“外部函式(裝飾器)”的區域性變數值。詳細資訊這裡不做討論。