命名空間(英語: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");