lua作用域本質(zhì)
lua沒有全局變量,為什么這樣設(shè)計呢?
以這個文件為例說明 test.lua
-------------------------------------
a = 100;
local m = 4;
function foo()
local i = 5;
print(a, m, i);
function bar()
print(a, m, i);
end
end
首先整個文件是個函數(shù),它本身有個默認的變量G(upval類型)。任何函數(shù)里面都可以再定義函數(shù),變量會往最外層找它的出處,如果沒有,則變成G['varname']。
所以以上的變量會是這樣的:
對文件這個函數(shù),有3個變量a, m, foo,函數(shù)名本身也是。
a => G['a'];
m => local;
foo => G['foo'];
對foo這個函數(shù),有4個變量i, print, a, m, bar。
i => local
print => G['print'];
m => upval
bar => G['bar']
對bar這個函數(shù),有4個變量print, a, m, i。
print => G['print'];
a => G['a'];
m => upval;
i => upval;
我們解釋下什么是local和upval。
local是已經(jīng)聲明為local的局部變量,lua變量跟js有點類似,除非顯示聲明為局部變量,否則是其它類型。local這樣很好理解。
upval是在本函數(shù)里沒有聲明,但是在外層有聲明的變量。簡單講就是在外層是local,或已經(jīng)是upval的,屬于本層函數(shù)的變量,如foo里的m,bar里的i。
G本身已經(jīng)是個upval,它的值是一個lua里面的hash table。
因此lua總共就4種類型 local, upval, table, tabup。因此任何看似全局變量的,其實是tabup,也就是G['var']。lua就是這樣通過抽象把全局變量給抹掉了。
本文僅代表作者觀點,版權(quán)歸原創(chuàng)者所有,如需轉(zhuǎn)載請在文中注明來源及作者名字。
免責聲明:本文系轉(zhuǎn)載編輯文章,僅作分享之用。如分享內(nèi)容、圖片侵犯到您的版權(quán)或非授權(quán)發(fā)布,請及時與我們聯(lián)系進行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com






