javascript:傳遞給函數的隱含參數:arguments

衆所周知,js是腳本語言,腳本語言的一個特點就是極其靈活。有時“靈活”到使我這種習慣c系主流語言的人不得不佩服腳本的強大。比如這裏要講到的arguments參數。本人第一次看到這個東東的時候,以爲就是“變相”的普通參數,只不過不用在定義函數的時候明確聲明而已。
不過,代碼是廉價的(Code is cheap.)看代碼:

function funcTest(a, b) {
     alert(a);
     alert(b);
     for (var i = 0; i < arguments.length; i++) {
         alert(arguments[i]);
     }
 }
 
function test() {
     funcTest(1, 2, 3); // 放到html頁進行執行
 }


代碼運行後怎麼樣,不錯,這裏的length實在是很奇怪,對不對?我們來看書中是怎麼說的,“代碼運行時會依次顯示:1,2,1,2,3。因此,在定義函數的時候,即使不指定參數列表,仍然可以通過arguments引用到所獲得的參數,這給編程帶來了很大的靈活性”。沒有比這句更加精闢的闡釋了。
看到這裏,我們可能都有一個疑問(如果你稍微具備一點js編程知識的話),arguments參數是不是js數組對象的一個實例?下面的代碼會幫你解決這個疑點:

Array.prototype.testArg = "test arguments";
 function funcArg() {
     alert(arguments.testArg);
 }
 function test() {
     alert(new Array().testArg);
     funcArg();
 }


代碼運行結果是先彈出"test arguments"和"undefined",爲什麼funcArg調用返回“undefined”?看到這裏相信你對上面的疑問已經消除。
到這裏你以爲你掌握了arguments的全部?那就太小瞧js的天才設計者(們)了,下面看另外一個有才的設計:
Q:使用遞歸來計算1 到n 的自然數之和

A1:

function sum(n) {
     if (1 == n) return 1;
     else return n + sum(n - 1);
 }
 
function test() {
     alert(sum(100)); ; // 放到html頁進行執行
 }


A2:

function sum(n) {
     if (1 == n) return 1;
     else return n + arguments.callee(n - 1);
 }
 
function test() {
     alert(sum(100)); ; // 放到html頁進行執行
 }


A1和A2這兩個回答都解決了問題,相信第一種方法是大多數人的常規做法,但是js推薦使用第二種,原書說A1這種方式“其中函數內部包含了對sum 自身的調用,然而對於JavaScript 來說,函數名僅僅是一個變量名,在函數內部調用sum 即相當於調用一個全局變量,不能很好的體現出是調用自身”,sum都調用sum了,還說“不能很好的體現出是調用自身”,爲什麼呢?
書到用時方恨少,查書,書上是這麼寫的:“arguments 對象的另一個屬性是callee,它表示對函數對象本身的引用,這有利於實現無名函數的遞歸或者保證函數的封裝性,”這話我承認說的有理,我從來都對書本尤其是技術類的書本保持高度的信任,可是這裏說“arguments 對象的另一個屬性是callee”,這裏“arguments ”怎麼成“對象”了?標題都說“傳遞給函數的隱含參數:arguments ”,難道抄書抄錯了?查看電子書,靠,複製粘貼還會有錯?
對象,對象?對象何其多,下篇找"對象"。

發佈了11 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章