範圍 (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。

results matching ""

    No results matching ""