基于JavaScript 下namespace 功能的簡單分析
更新時間:2013年07月05日 15:41:51 作者:
前些天在剝離 百度隨心聽 的播放器引擎時,看到了一個namespace方法,覺得新奇,當(dāng)然只是對于我自己而言,我入門js不久,經(jīng)驗(yàn)尚淺
之前看到網(wǎng)易還是新浪還是什么什么網(wǎng)站來著,也是用類似這種東西的,當(dāng)時對js只是九牛一毛的水平,當(dāng)場被嚇傻了。
但這次,我打算親自分析下,以后在看到就不會迷茫了。
//調(diào)用例子:bradio.namespace("bradio.lang.array");
//下面是百度編譯后的源碼,變量都是a,b,c,d...之后我會重新寫一個規(guī)范點(diǎn)的。
//好了,開始分析
bradio.namespace = function () { //創(chuàng)建命名空間
var a = arguments, //["bradio.lang.array"]
b = null, //用于存放上一級對象
c, d, e, f; //c是計數(shù)器,d是內(nèi)層循環(huán)的計數(shù)器,e是拆分后命名空間數(shù)組,f是arguments參數(shù)長度
c = 0;
for (f = a.length; c < f; c++) {
e = ("" + a[c]).split("."); //拆分命名空間,拆分后 ["bradio", "lang", "array"]
b = bradio; //基礎(chǔ)對象,基于這個對象進(jìn)行命名空間的添加
for (d = "bradio" == e[0] ? 1 : 0; d < e.length; d++) //如果第一個是bradio, 就第二個開始遍歷 ["bradio","lang","array"]
b[e[d]] = b[e[d]] || {}, b = b[e[d]]
//其實(shí)相當(dāng)于
//b[e[d]] = b[e[d]] || {} //如果當(dāng)前對象已經(jīng)操作就用當(dāng)前對象,不存在就賦值空對象
//b = b[e[d]] //用字對象覆蓋b,接下去的循環(huán)基于子對象添加命名空間
}
return b//返回最后一層對象
};
下面是整理后的,能看懂的版本
//bradio.namespace("bradio.lang.array");
bradio.namespace = function () { //創(chuàng)建命名空間
var args = arguments,
parent = null,
arr, i, j, len;
for (i=0, len = args.length; i < len; i++) {
arr = ("" + args[i]).split(".");
parent = bradio;
for(j = "bradio" == arr[0] ? 1 : 0; j < arr.length; j++) {
parent[ arr[j] ] = parent[ arr[j] ] || {};
parent = parent[ arr[j] ];
}
}
return parent;
}
當(dāng)然只是我的理解,如果哪里不是很對,還請各位大俠幫忙指出,以免誤導(dǎo)了大家。
但這次,我打算親自分析下,以后在看到就不會迷茫了。
復(fù)制代碼 代碼如下:
//調(diào)用例子:bradio.namespace("bradio.lang.array");
//下面是百度編譯后的源碼,變量都是a,b,c,d...之后我會重新寫一個規(guī)范點(diǎn)的。
//好了,開始分析
bradio.namespace = function () { //創(chuàng)建命名空間
var a = arguments, //["bradio.lang.array"]
b = null, //用于存放上一級對象
c, d, e, f; //c是計數(shù)器,d是內(nèi)層循環(huán)的計數(shù)器,e是拆分后命名空間數(shù)組,f是arguments參數(shù)長度
c = 0;
for (f = a.length; c < f; c++) {
e = ("" + a[c]).split("."); //拆分命名空間,拆分后 ["bradio", "lang", "array"]
b = bradio; //基礎(chǔ)對象,基于這個對象進(jìn)行命名空間的添加
for (d = "bradio" == e[0] ? 1 : 0; d < e.length; d++) //如果第一個是bradio, 就第二個開始遍歷 ["bradio","lang","array"]
b[e[d]] = b[e[d]] || {}, b = b[e[d]]
//其實(shí)相當(dāng)于
//b[e[d]] = b[e[d]] || {} //如果當(dāng)前對象已經(jīng)操作就用當(dāng)前對象,不存在就賦值空對象
//b = b[e[d]] //用字對象覆蓋b,接下去的循環(huán)基于子對象添加命名空間
}
return b//返回最后一層對象
};
下面是整理后的,能看懂的版本
復(fù)制代碼 代碼如下:
//bradio.namespace("bradio.lang.array");
bradio.namespace = function () { //創(chuàng)建命名空間
var args = arguments,
parent = null,
arr, i, j, len;
for (i=0, len = args.length; i < len; i++) {
arr = ("" + args[i]).split(".");
parent = bradio;
for(j = "bradio" == arr[0] ? 1 : 0; j < arr.length; j++) {
parent[ arr[j] ] = parent[ arr[j] ] || {};
parent = parent[ arr[j] ];
}
}
return parent;
}
當(dāng)然只是我的理解,如果哪里不是很對,還請各位大俠幫忙指出,以免誤導(dǎo)了大家。
相關(guān)文章
JavaScript中的分號插入機(jī)制詳細(xì)介紹
這篇文章主要介紹了JavaScript中的分號插入機(jī)制詳細(xì)介紹,本文講解JavaScript中各種情況下的分號插入機(jī)制,需要的朋友可以參考下2015-02-02基于JavaScript 下namespace 功能的簡單分析
前些天在剝離 百度隨心聽 的播放器引擎時,看到了一個namespace方法,覺得新奇,當(dāng)然只是對于我自己而言,我入門js不久,經(jīng)驗(yàn)尚淺2013-07-07javascript開發(fā)技術(shù)大全 第4章 直接量與字符集
直接量就是在程序中顯示出來的數(shù)值。javascript直接量包括:字符串、數(shù)字、布爾、數(shù)組、函數(shù)、對象、和特殊直接2011-07-07javascript中call()、apply()的區(qū)別
這篇文章主要介紹了javascript中call()、apply()的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03