範圍 (Scope)
每個變數都有範圍 (Scope) 與可見性 (Visibility),所謂的可見性是指:該變數能否被看見,而所謂的範圍是指該變數”在哪裡能被看見”。在 Lua 中,根據變數的範圍,可以將變數分為兩種類型:區域 (Local) 與 全域 (Global)變數。沒有前綴詞定義的變數皆為全域 (Global) 變數:
myNumber = 12
全域變數可以在程式碼的任何地方
較低的效率
相較於區域變數,它們沒辦法有效率的被處理,這是因為全域變數會被加入到一個名為 _G
的表格裡,存取全域變數都需要額外的步驟去操作這張表格。
容易導致難以追蹤的臭蟲 (Bug)
因為全域變數可以在程式的任何地方被使用,你的夥伴可以在程式的任何一個複寫你之前宣告的全域變數。當臭蟲發生的時候,也因為全域變數可以在任何地方被看見的特性,很難去追中全域變數隨著程式運作的變化
記憶體洩漏 (Memory leak)
記憶體洩漏是由於程式撰寫不當,參考已經沒有在使用的物件,導致垃圾回收器 (gabage collector) 無法回收沒有在使用的記憶體,讓可用記憶體越來越少的現象。由於全域變數會被 _G
這個表格參考,他沒辦法隨著一個區域的結束而被回收。能夠回收全域變數的方法只有將它設置為 nil,然而這個步驟是多數開發者容易疏忽的,也因此容易導致記憶體洩漏。
另一個變數種類則是區域 (Local) 變數,區域變數定義時會被前綴詞 local
所修飾:
local myNumber = 12
與全域變數不同,區域變數只在部分程式區塊,或是其區塊內的子區塊內具有可見性,讓我們實際看看一個例子:
local myNumber = 1
while myNumber < 10 do
if myNumber == 5 then
local isFive = true
print( myNumber, isFive )
end
print( isFive )
myNumber = myNumber + 1
end
print( myNumber, isFive )
輸出:
nil
nil
nil
nil
5 true
nil
nil
nil
nil
nil
10 nil
當 myNumber
遞增至 5 ,我們定義一個新的區域變數 isFive
,將它設置為 true
並透過 print()
印出 。一旦離開了 if 判斷式,第 8 行的 print()
卻是印出 nil
,這是因為 isFive
是定義在 if
區塊內的區域變數,當離開了 if
區塊,isFive
便消失了。
然而由於 myNumber
是定義在最 while
迴圈之外,所以他能被 while
迴圈與 if
判斷式看見,正常的進行累加的操作,才能在第 11 行透過 print()
印出 10。