javascript 函數(shù)詳解2 -- arguments
今天我們接著上篇文章來繼續(xù)javascript函數(shù)這個主題。今天要講的是函數(shù)對像中一個很重要的屬性--arguments。
相關(guān)閱讀:
arguments對象參數(shù)數(shù)組引用
arguments是函數(shù)對象內(nèi)部一個比較特殊的類數(shù)組對象,這個對象中包含了所屬函數(shù)的參數(shù)列表,同時還包含一個指向函數(shù)原型對象的指針.
我們先來討論下arguments中的參數(shù)數(shù)組,我們可以直接使用[index]的類似訪問數(shù)組的方式來訪問參數(shù)。要真正理解這特性,我們先要知道javascript的函數(shù)不關(guān)心你傳遞的參數(shù),因為在調(diào)用函數(shù)的時候,在函數(shù)內(nèi)部他接收的是一個參數(shù)數(shù)組,也就是說,理論上,我們可以在聲明函數(shù)的時候可以不聲明任何參數(shù),但是在調(diào)用的時候卻可以傳遞任意多的參數(shù)。
如下代碼示例:
function sayHi(){ var name = arguments[0]||"default name", greeting = arguments[1]||" how are you"; console.log("Hello "+name+","+ greeting); } //不傳參數(shù)調(diào)用 sayHi(); //傳一個參數(shù)調(diào)用 sayHi("John"); //傳兩個參數(shù)調(diào)用 sayHi("John","你好!");
執(zhí)行結(jié)果:
接下來我們在看另外一段代碼,來探索arguments對象與參數(shù)列表的引用關(guān)系。
function dosum(op1,op2){ arguments[1] = 20; console.log(arguments[0]+op2); } dosum(1,1);
我們先預(yù)測下執(zhí)行結(jié)果,2還是21?
真正的執(zhí)行結(jié)果如下:
針對上面的執(zhí)行結(jié)果我們可以抽象下argument與參數(shù)數(shù)組間的引用管理模型。
arguments callee屬性
arguments callee屬性是一個指向函數(shù)對象的指針,靈活使用該屬性可以大大降低代碼與函數(shù)名的耦合度,同時可以使代碼更加靈活。
降低耦合度一般在遞歸運算中體現(xiàn)比較明顯。
如下代碼:
function factorial(num){ if(num<=1){ return 1; } else{ return num*factorial(num-1); } }
上面這段代碼最大的缺點就是與函數(shù)名factorial的耦合,正如我們一開始講的,函數(shù)名是一個指針,也就是一個變量,如果我們能保證該變量一直引用該函數(shù)對象,那么這段代碼就一直能返回我們所期望的結(jié)果。一旦該變量指向了其他對象,上面的代碼就會出錯,這時候 arguments.callee就能夠發(fā)揮作用了。修改如下:
function factorial(num){ if(num <= 1){ return 1; }else{ return num * arguments.callee(num -1 ); } }
這樣,這個函數(shù)對象的計算結(jié)果就與函數(shù)名factorial沒有關(guān)系了,就算之后做如下操作,我們依舊可以得到正確的結(jié)果。
var afunc = factorial;
factorial = null;
afunc(3); // 同樣可以正確返回6
通過arguments.callee的另外一個比較靈活的應(yīng)用如下:
var otherfunc = (function(){ console.log("do something cool"); return arguments.callee; })();
上面代碼所做的操作時立即執(zhí)行了一個函數(shù),并返回該匿名函數(shù)的引用,賦值給otherfunc,這時我們就可以在其他地方繼續(xù)調(diào)用這個函數(shù)。
這樣的用法是我在項目中遇到的,頁面初始化時要做一些操作,也就是頁面加載完成后立即執(zhí)行該函數(shù),但是這個函數(shù)并不是一次性的,我們還需要在該頁面的其他時候來調(diào)用這個函數(shù),上面的代碼,個人會比先聲明一個函數(shù),然后在頁面加載完成后調(diào)用要優(yōu)雅一些,見仁見智罷了。


浙公網(wǎng)安備 33010602011771號