定義:名字空間是組織、歸類、標識一組具名對象的名字,是模塊化編程的重要基礎。
作用:
在名字空間內部定義的對象名字由名字空間管理。引用外部名字空間的名字時需要在對象名字前添加名字空間前綴。不同的名字空間中可以有相同的名字而互不干擾,有效的避免了名字污染。一個名字空間可以包含另一個名字空間,名字之間使用成員操作符“.”連接,稱爲名字空間路徑。主要目的是用來組織和重用代碼。
名字空間,顧名思義,就是叫這個名字的一個目錄,不同的名字裏,可能會有相同的功能,如console下有open功能,io下也有open功能。可以看做是一個個不同的目錄。所以,名字空間叫web.layout.debug,對應的目錄就是web\layout\debug\。這樣就代表,使用一個功能,先把他所在的根目錄import進來,他的根目錄就成了這個代碼中的namespace,然後通過.來逐次的找到對應的目錄下,使用這個函數。函數就是把預先寫好的功能封裝起來,作用對象用一個形式上的代號先佔位一下,這個代號叫做形參,用的時候通過(),在括號內把實際要這個封裝好的功能要操作的對象傳進去就可以用了。然後這個括號內的實際內容會給到功能裏,代替形參的位置來運行。
定義名字空間語法:
namespace NAME {
//成員,名字內部空間代碼
}
名字空間內可以嵌套名字空間,訪問方式爲“名字空間.內部名字空間.成員”,內嵌的名字空間內的功能,要訪問頂層名字空間要使用..操作符。“..”作爲前綴,則該名字空間爲全局名字。
例如:
namespace 某學校{
namespace 一年級 {
namespace 一班{
班長 = "張宇"
}
}
namespace 二年級 {
namespace 一班{
班長 = "王宇"
}
}
}
如果在二級一班中要調用一年紀一班的張宇,要用:
..console.log(global.某學校.一年級.一班.班長),要調用自己當前的變量班長,可以用self.班長,其中self可以省略。
爲什麼要在console前面加兩個..
原因:所有的代碼,首先都是被包含在一個global內。在global名字空間中包含的其他名字空間,不管是定義的還是import進來的,要想用global空間的變量或功能,都要通過“global.變量”名來引用。其中,global可以省略爲兩個點。
============================================================
特殊的名字空間:global和self:
1、global
global爲默認的全局名字空間,當aau代碼文件加載時,默認都運行在global名字空間。所有的代碼,首先都是被包含在一個:
namespace global{
……
}
之內的
2、self
self表示當前名字空間。
變量的默認名字空間爲global名字空間,並可以使用namespace改變指定代碼塊的名字空間。可以使用self關鍵字訪問當前名空間。使用..操作符訪問global名字空間。
=============================================================
import方式導入庫文件。
標準庫與內核庫:
最後,用一個例子來解釋一下名字空間、成員變量、局部變量的關係
import console; num= "最外面"; namespace list { num = "中間成員變量" var num = "最裏面局部變量" ..console.log("如下:") ..io.print(self.num,num,global.num) } console.pause(true);
以上代碼輸出結果是:
中間成員變量 最裏面局部變量 最外面
原因是:
self.num 是當前名字空間的成員變量, 而var語句聲明的是局部變量。var的作用域是其的右下方。成員變量就相當於list.num 最外面的就相當於global.num,是全局名字空間。如果這裏不用namespace,則self.num 和 global.num 相同,因爲不做namespace定義的時候,當前名字空間默認是全局名字空間。
語句塊有獨立的局部變量作用域,語句塊內部的局部變量擁有最高存取優先級。
語句塊有獨立的局部變量作用域,語句塊內部的局部變量擁有最高存取優先級。aardio根據標誌符查找對象的順序依次爲:
1.當前語句塊局部變量。
2.上層語句塊局部變量(upvar)。
3.當前名字空間(self)成員變量。