各位javascript的大侠们好,我在学习javascript中,遇到一段代码如下:
function $package(ns) {
if (typeof(ns) != "string")
return;
ns = ns.split(".");
var o, ni;
for (var i = 0, len = ns.length;i < len, ni = ns[i]; i++) {
try {
o = (o ? (o[ni] = o[ni] || {}) : (eval(ni + "=" + ni + "||{}")))
} catch (e) {
o = eval(ni + "={}")
}
}
}
然后后面又调用$package('usermanager')之类的,看不懂这段代码的作用,还请大侠细细解析,十分感激!

解决方案 »

  1.   

    建立命名空间,其实很简单的如果是 普通的字符串, var ns = {} 就行了
    如果要建立两级以上,就要这样  var ns = {} ; ns.childns = {}
      

  2.   

    回复一楼的大侠,可是这段代码就是改变了变量o和ni的值,但是这两个变量都是局部变量,后面也使用不到,还是不太理解“建立命名空间”的实现方式,麻烦抽时间说具体些?
    另外当我这么写的时候
    function $package(ns) {
    if (typeof(ns) != "string")
    return;
    ns = ns.split(".");
    var o, ni;
    for (var i = 0, len = ns.length;i < len, ni = ns[i]; i++) {
    try {
    o = (o ? (o[ni] = o[ni] || {}) : (eval(ni + "=" + ni + "||{}")))
    } catch (e) {
    o = eval(ni + "={}")
    }
    }
    }
    $package('usermanagement');//这个地方如果不写,下一行就会报“usermanagement undefined”???
    usermanagement.user = function() {
    return {
    init : function(){
    alert("init");
    }
    }
    }();
    usermanagement.user.init();
      

  3.   

    请查eval函数的作用
     
    var usermanagement  = {}
    usermanagement.user = function() {
    return {
    init : function(){
    alert("init");
    }
    }
    }();
    usermanagement.user.init();
      

  4.   

    十分抱歉,最近有事给耽误了,回复慢了。
    现在我知道,如果只是写$package('usermanager'),那么函数可以简写为
    function $package(ns) {
    if (typeof(ns) != "string")
    return;
    eval(ns + "={}")
    }
    之所以要写这么复杂,是考虑到可能使用此类的写法,比如$package('usermanager.dddd').
    按照原来方法的规则,第一次遍历时,应该会发生异常,
    所以执行o = eval(ni + "={}"),也就是执行了usermanager = {}
    第二次不会发生异常,所以执行了o[ni] = o[ni] || {},但是这一段我就看不懂了?继续求教!非常感谢!
      

  5.   

    undefined || {} = {}
      

  6.   


    function $package(ns) {  //该方法的作用是传入一个变量名,然后创建这个对象并将其存入o中
    if (typeof(ns) != "string")
    return;
    ns = ns.split(".");
    var o, ni;
    for (var i = 0, len = ns.length;i < len, ni = ns[i]; i++) {
    try {
    o = (o ? (o[ni] = o[ni] || {}) : (eval(ni + "=" + ni + "||{}"))) 
    } catch (e) {
    o = eval(ni + "={}")
    }
    }
    }
    $package('usermanagement');//如果不执行这里的话 usermanagement这个对象就没有创建,所以会报错
    usermanagement.user = function() {
    return {
    init : function(){
    alert("init");
    }
    }
    }();
    usermanagement.user.init();
    o = (o ? (o[ni] = o[ni] || {}) : (eval(ni + "=" + ni + "||{}"))) 关于这一句的解释如果o对象已经创建过,那么看当前名称的属性是否在o中存在,存在就用存在的值,不存在就赋一个空对象o[ni] = o[ni] || {}
    否则 定义变量eval(ni + "=" + ni + "||{}")并将其赋给o,值为ni本身,如本身不存在就赋一个空对象
      

  7.   

    继续请教p2227,如果第二次是执行了undefined || {} = {},那么语法都通不过。
    我的理解是,$package('usermanager.dddd')的效果等同于
    usermanager = {}
    usermanager.dddd = {}
    之后就可以使用
    usermanager.dddd.user = function(){};
    可是目前据分析,第二次执行的语句是undefined || {} = {},而不是usermanager.dddd = {}
      

  8.   

    当然通不过了我的意思是undefined跟一个对象进行与操作的结果是对象本身
      

  9.   

    当然通不过了我的意思是undefined跟一个对象进行或操作的结果是对象本身
      

  10.   

    可是这个结果并不符合要求啊,不会是执行了
    usermanager = {}
    usermanager.dddd = {}
      

  11.   


    var o;
    o = eval("c={}");
    c.a={};这样子的结果是,有一个全局变量c={},并且c.a={},然后o是c的引用,所也有o={},o.a={}var o;
    o = eval("c={}");
    o = eval("c.a = c.a||{}")这样子的结果是,有一个全局变量c={},并且c.a={},然后o是o.a的引用,所o={}
      

  12.   

    顺便说说,我是用chrome测试的
      

  13.   

    您好,关键是o = eval("c.a = c.a||{}")怎么会变成c.a={},呵呵,如果这个地方理解了,应该就没问题了,感谢你这么耐心的回答!
      

  14.   

    那就回到5楼了,c.a = c.a||{}并没有变成c.a={},只是效果相同。