各位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')之类的,看不懂这段代码的作用,还请大侠细细解析,十分感激!
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')之类的,看不懂这段代码的作用,还请大侠细细解析,十分感激!
如果要建立两级以上,就要这样 var ns = {} ; ns.childns = {}
另外当我这么写的时候
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();
var usermanagement = {}
usermanagement.user = function() {
return {
init : function(){
alert("init");
}
}
}();
usermanagement.user.init();
现在我知道,如果只是写$package('usermanager'),那么函数可以简写为
function $package(ns) {
if (typeof(ns) != "string")
return;
eval(ns + "={}")
}
之所以要写这么复杂,是考虑到可能使用此类的写法,比如$package('usermanager.dddd').
按照原来方法的规则,第一次遍历时,应该会发生异常,
所以执行o = eval(ni + "={}"),也就是执行了usermanager = {}
第二次不会发生异常,所以执行了o[ni] = o[ni] || {},但是这一段我就看不懂了?继续求教!非常感谢!
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本身,如本身不存在就赋一个空对象
我的理解是,$package('usermanager.dddd')的效果等同于
usermanager = {}
usermanager.dddd = {}
之后就可以使用
usermanager.dddd.user = function(){};
可是目前据分析,第二次执行的语句是undefined || {} = {},而不是usermanager.dddd = {}
usermanager = {}
usermanager.dddd = {}
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={}