2011-12-11 78 views
2

下面有這對於模塊中創建命名空間中的劇本,我無法理解parent = parent[parts[i]]後是如何工作的,它是如何創建嵌套?有什麼建議麼?JavaScript函數創建命名空間

var MYAPP = MYAPP || {}; 
MYAPP.namespace = function (ns_string) { 
    var parts = ns_string.split('.'), 
     parent = MYAPP, 
     i; 

    if (parts[0] === "MYAPP") { 
     parts = parts.slice(1); 
    } 
    for (i = 0; i < parts.length; i += 1) { 
     // create property if doesn't exist 
     if (typeof parent[parts[i]] === "undefined") { 
      parent[parts[i]] = {}; 
     } 
     parent = parent[parts[i]]; 
    } 
    return parent; 
}; 

var module2 = MYAPP.namespace('MYAPP.modules.module2'); 
module2 === MYAPP.modules.module2; // true 
+1

那項任務,以「模塊2」看起來很亂。 – Pointy

+0

的'「MYAPP」'比較,以及 - 你確定這是工作的代碼? – pimvdb

+0

糾正!現在的作品 –

回答

0

簡而言之,函數將函數參數(完全限定的名稱)拆分爲其組成部分(用點分隔)。然後,它說,「這種對象作爲當前父的屬性存在嗎?不,創建它作爲對象的屬性,並使其在未來的父母。是的,設置現有的父對象,並重復每個名字。「在此之後,它返回整個對象,該對象已分配給您的VAR 模塊2

+0

在第一次迭代後父== MYAPP,父後=父[份[I]] - 父[份[I]] ==空對象{},如何在第二次迭代父的作品? –

0

這是你聽不懂的部分:

for (i = 0; i < parts.length; i += 1) { 
    // create property if doesn't exist 
    if (typeof parent[parts[i]] === "undefined") { 
    parent[parts[i]] = {}; 
    } 
    parent = parent[parts[i]]; 
} 


So parent = MYAPP and parts = ['modules', 'module2']; 

這裏是什麼在循環中完成:

**i = 0** <br /> 
typeof parent[parts[0]] equals 'undefined' since MYAPP['modules] doesn't exist <br /> 
MYAPP['modules'] = {} (MYAPP is parent here and parts[0] equals 'modules') <br /> 
parent = MYAPP['modules'] <br /> 
**i = 1** <br /> 
typeof parent[parts[1]] equals 'undefined' since MYAPP['modules]['module2'] doesn't exist <br /> 
MYAPP['modules']['module2'] = {} <br /> 
parent = MYAPP['modules']['module2'] <br /> 
exists the loop since 1 < 1 is false <br /> 
returns parent, which is MYAPP['modules']['module2'] <br />