javascript arguments 傳遞給函數(shù)的隱含參數(shù)
更新時間:2009年08月21日 01:35:35 作者:
眾所周知,js是腳本語言,腳本語言的一個特點就是極其靈活。有時“靈活”到使我這種習(xí)慣c系主流語言的人不得不佩服腳本的強大。比如這里要講到的 arguments參數(shù)。
本人第一次看到這個東東的時候,以為就是“變相”的普通參數(shù),只不過不用在定義函數(shù)的時候明確聲明而已。
不過,代碼是廉價的(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頁進行執(zhí)行
}
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頁進行執(zhí)行
}
代碼運行后怎么樣,不錯,這里的length實在是很奇怪,對不對?我們來看書中是怎么說的,“代碼運行時會依次顯示:1,2,1,2,3。因此,在定義函數(shù)的時候,即使不指定參數(shù)列表,仍然可以通過arguments引用到所獲得的參數(shù),這給編程帶來了很大的靈活性”。沒有比這句更加精辟的闡釋了。
看到這里,我們可能都有一個疑問(如果你稍微具備一點js編程知識的話),arguments參數(shù)是不是js數(shù)組對象的一個實例?下面的代碼會幫你解決這個疑點:
Array.prototype.testArg = " test arguments " ;
function funcArg() {
alert(arguments.testArg);
}
function test() {
alert( new Array().testArg);
funcArg();
}
Array.prototype.testArg = " test arguments " ;
function funcArg() {
alert(arguments.testArg);
}
function test() {
alert( new Array().testArg);
funcArg();
}
代碼運行結(jié)果是先彈出"test arguments"和"undefined",為什么funcArg調(diào)用返回“undefined”?看到這里相信你對上面的疑問已經(jīng)消除。
到這里你以為你掌握了arguments的全部?那就太小瞧js的天才設(shè)計者(們)了,下面看另外一個有才的設(shè)計:
Q:使用遞歸來計算1 到n 的自然數(shù)之和
A1:
function sum(n) {
if ( 1 == n) return 1 ;
else return n + sum(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁進行執(zhí)行
} function sum(n) {
if ( 1 == n) return 1 ;
else return n + sum(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁進行執(zhí)行
}
A2:
function sum(n) {
if ( 1 == n) return 1 ;
else return n + arguments.callee(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁進行執(zhí)行
} function sum(n) {
if ( 1 == n) return 1 ;
else return n + arguments.callee(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁進行執(zhí)行
}
A1和A2這兩個回答都解決了問題,相信第一種方法是大多數(shù)人的常規(guī)做法,但是js推薦使用第二種,原書說A1這種方式“其中函數(shù)內(nèi)部包含了對 sum 自身的調(diào)用,然而對于JavaScript 來說,函數(shù)名僅僅是一個變量名,在函數(shù)內(nèi)部調(diào)用sum 即相當(dāng)于調(diào)用一個全局變量,不能很好的體現(xiàn)出是調(diào)用自身”,sum都調(diào)用sum了,還說“不能很好的體現(xiàn)出是調(diào)用自身”,為什么呢?
書到用時方恨少,查書,書上是這么寫的:“arguments 對象的另一個屬性是callee,它表示對函數(shù)對象本身的引用,這有利于實現(xiàn)無名函數(shù)的遞歸或者保證函數(shù)的封裝性,”這話我承認說的有理,我從來都對書本尤其是技術(shù)類的書本保持高度的信任,可是這里說“arguments 對象的另一個屬性是callee”,這里“arguments ”怎么成“對象”了?標(biāo)題都說“傳遞給函數(shù)的隱含參數(shù):arguments ”,難道抄書抄錯了?查看電子書,靠,復(fù)制粘貼還會有錯?
對象,對象?對象何其多,下篇找"對象"。
不過,代碼是廉價的(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頁進行執(zhí)行
}
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頁進行執(zhí)行
}
代碼運行后怎么樣,不錯,這里的length實在是很奇怪,對不對?我們來看書中是怎么說的,“代碼運行時會依次顯示:1,2,1,2,3。因此,在定義函數(shù)的時候,即使不指定參數(shù)列表,仍然可以通過arguments引用到所獲得的參數(shù),這給編程帶來了很大的靈活性”。沒有比這句更加精辟的闡釋了。
看到這里,我們可能都有一個疑問(如果你稍微具備一點js編程知識的話),arguments參數(shù)是不是js數(shù)組對象的一個實例?下面的代碼會幫你解決這個疑點:
Array.prototype.testArg = " test arguments " ;
function funcArg() {
alert(arguments.testArg);
}
function test() {
alert( new Array().testArg);
funcArg();
}
Array.prototype.testArg = " test arguments " ;
function funcArg() {
alert(arguments.testArg);
}
function test() {
alert( new Array().testArg);
funcArg();
}
代碼運行結(jié)果是先彈出"test arguments"和"undefined",為什么funcArg調(diào)用返回“undefined”?看到這里相信你對上面的疑問已經(jīng)消除。
到這里你以為你掌握了arguments的全部?那就太小瞧js的天才設(shè)計者(們)了,下面看另外一個有才的設(shè)計:
Q:使用遞歸來計算1 到n 的自然數(shù)之和
A1:
function sum(n) {
if ( 1 == n) return 1 ;
else return n + sum(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁進行執(zhí)行
} function sum(n) {
if ( 1 == n) return 1 ;
else return n + sum(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁進行執(zhí)行
}
A2:
function sum(n) {
if ( 1 == n) return 1 ;
else return n + arguments.callee(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁進行執(zhí)行
} function sum(n) {
if ( 1 == n) return 1 ;
else return n + arguments.callee(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁進行執(zhí)行
}
A1和A2這兩個回答都解決了問題,相信第一種方法是大多數(shù)人的常規(guī)做法,但是js推薦使用第二種,原書說A1這種方式“其中函數(shù)內(nèi)部包含了對 sum 自身的調(diào)用,然而對于JavaScript 來說,函數(shù)名僅僅是一個變量名,在函數(shù)內(nèi)部調(diào)用sum 即相當(dāng)于調(diào)用一個全局變量,不能很好的體現(xiàn)出是調(diào)用自身”,sum都調(diào)用sum了,還說“不能很好的體現(xiàn)出是調(diào)用自身”,為什么呢?
書到用時方恨少,查書,書上是這么寫的:“arguments 對象的另一個屬性是callee,它表示對函數(shù)對象本身的引用,這有利于實現(xiàn)無名函數(shù)的遞歸或者保證函數(shù)的封裝性,”這話我承認說的有理,我從來都對書本尤其是技術(shù)類的書本保持高度的信任,可是這里說“arguments 對象的另一個屬性是callee”,這里“arguments ”怎么成“對象”了?標(biāo)題都說“傳遞給函數(shù)的隱含參數(shù):arguments ”,難道抄書抄錯了?查看電子書,靠,復(fù)制粘貼還會有錯?
對象,對象?對象何其多,下篇找"對象"。
您可能感興趣的文章:
- js的隱含參數(shù)(arguments,callee,caller)使用方法
- javascript內(nèi)置對象arguments詳解
- javascript 利用arguments實現(xiàn)可變長參數(shù)
- JS函數(shù)動態(tài)傳遞參數(shù)的方法分析【基于arguments對象】
- javascript arguments使用示例
- Javascript中arguments對象的詳解與使用方法
- JavaScript中使用arguments獲得函數(shù)傳參個數(shù)實例
- JS中call/apply、arguments、undefined/null方法詳解
- 深入理解JS函數(shù)的參數(shù)(arguments)的使用
- JavaScript中arguments的使用方法詳解
相關(guān)文章
js在數(shù)組中刪除重復(fù)的元素自保留一個(兩種實現(xiàn)思路)
遍歷要刪除的數(shù)組arr, 把元素分別放入另一個數(shù)組tmp中,在判斷該元素在arr中不存在才允許放入tmp中,具體實現(xiàn)如下,需要的朋友可以看看2014-08-08JAVASCRIPT 客戶端驗證數(shù)據(jù)的合法性代碼(正則)
JAVASCRIPT 客戶端驗證數(shù)據(jù)的合法性代碼,比較全了,所以簡單分頁了下,喜歡的朋友可以收藏下。2010-04-04Js生成隨機數(shù)/隨機字符串的方法小結(jié)【5種方法】
這篇文章主要介紹了Js生成隨機數(shù)/隨機字符串的方法,結(jié)合實例形式總結(jié)分析了5種Js生成隨機數(shù)/隨機字符串的操作技巧,需要的朋友可以參考下2020-05-05實用Javascript調(diào)試技巧分享(小結(jié))
這篇文章主要介紹了實用Javascript調(diào)試技巧分享(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06onclick與listeners的執(zhí)行先后問題詳細解剖
javascript中onclick與listeners的執(zhí)行先后問題一直都是大家所疑惑的地方,接下來將為大家解決此疑惑,感興趣的朋友可以了解下哦2013-01-01