命名空间(英语:Namespace)表示标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不一样命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,由于已有的定义都处于其它命名空间中。(维基百科)ide
当一个工程很大时,既有自身的代码,又有引用的外部库,当自身库和外部库中的对象重名时,没有命名空间将没法区分他们。函数
JavaScript语言的与语法中,没有内置命名空间,但这种特征很是容易实现。添加到命名空间的属性可能已经存在,因此再添加属性或者建立命名空间之间,咱们应该先检查命名空间是否存在。spa
var FN = FN || {};
若是定义FN.fn1.fn2,则:code
var FN = FN || {}; var FN.fn1 = FN.fn1 || {}; var FN.fn1.fn2 = FN.fn1.fn2 || {};
能够看出每建立一个命名空间或者添加属性,都须要对对象或属性作附加检查,产生大量重复代码,这违背了DRY原则,也是产生命名空间函数的缘由。咱们但愿经过如下命名空间函数调用产生以上效果:对象
FN.namespace("FN.fn1.fn2")
因而咱们能够作如下实现:ip
var FN = FN || {}; FN.namespace = function(ns_string){ var parts = ns_string.split("."), parent = FN, i; if(parts[0] === "FN"){ left = parts.slice(1); } for(i = 0 ;i < left.length; i += 1){ if(typeof parent[left[i]] === "undefined"{ parent[left[i]] = {}; } parent = parent[left[i]] ; } } x = FN.namespace("FN.fn1.fn2");