比如你找張三,全國可能有N多個張三,大家不知道你最終找哪個張三;如果你找X省X市X縣X村X戶的張三,則大家即可明白你找的是那個張三。同樣,現在AJAX應用很廣泛,又有很多不錯的JS框架,則可能不同的框架中定義相同的方法。如果在應用中要集成多個JS框架,還有自己開發的JS方法,它們的方法有同名的可能。利用命名空間即可解決此類問題。
什么是命名空間?
命名空間(namespace)表示
標識符(identifier)的上下文(context)。一個標識符可在多個命名空間中定義,它在不同命名空間中的含義是互不相干的。這樣,在一個新的命名空間中可定義任何標識符,它們不會與任何已有的標識符發生沖突,因為已有的定義都處于其它命名空間中。
比如你分別調用:A.B.test();和D.E.test();則系統即可區分你要調用的是具體是那個test()方法。這里的A.B和D.E既是命名空間。
下面給出一段代碼:(出處忘了,感謝原作者!)
此段代碼就是定義"命名空間"
我的理解:
JS沒有真正意義上的命名空間,我們只是利用JS的一些特性來模擬命名空間的效果
<script type="text/javascript">
var Namespace = {};
// 全局對象僅僅存在register函數,參數為名稱空間全路徑,如"Grandsoft.GEA"
Namespace.register = function(fullNS)
{
// 將命名空間切成N部分, 比如Grandsoft、GEA等
var nsArray = fullNS.split('.');
var sEval = "";
var sNS = "";
for (var i = 0; i < nsArray.length; i++)
{
if (i != 0) sNS += ".";
sNS += nsArray[i];
// 依次創建構造命名空間對象(假如不存在的話)的語句
// 比如先創建Grandsoft,然后創建Grandsoft.GEA,依次下去
sEval += "if (typeof(" + sNS + ") == 'undefined') " + sNS + " = new Object();"
}
if (sEval != "") eval(sEval);
}
Namespace.register("com.companyname");
</script>
在這里,我們就定義了一個命名空間對象com.companyname,其實就是定義了2個對象 com和companyname, 而companyname又是com的屬性,這里只不過是用一個方法來定義命名空間。這樣,利用此命名空間空間可以來定義其它的方法了,例如:
com.companyname.test=function(){alert("test")};
調用方法:com.companyname.test();
參考:http://zh.wikipedia.org/wiki/%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4