比如你找张三,全国可能有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