javascript arguments 傳遞給函數(shù)的隱含參數(shù)
更新時(shí)間:2009年08月21日 01:35:35 作者:
眾所周知,js是腳本語(yǔ)言,腳本語(yǔ)言的一個(gè)特點(diǎn)就是極其靈活。有時(shí)“靈活”到使我這種習(xí)慣c系主流語(yǔ)言的人不得不佩服腳本的強(qiáng)大。比如這里要講到的 arguments參數(shù)。
本人第一次看到這個(gè)東東的時(shí)候,以為就是“變相”的普通參數(shù),只不過(guò)不用在定義函數(shù)的時(shí)候明確聲明而已。
不過(guò),代碼是廉價(jià)的(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頁(yè)進(jìn)行執(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頁(yè)進(jìn)行執(zhí)行
}
代碼運(yùn)行后怎么樣,不錯(cuò),這里的length實(shí)在是很奇怪,對(duì)不對(duì)?我們來(lái)看書中是怎么說(shuō)的,“代碼運(yùn)行時(shí)會(huì)依次顯示:1,2,1,2,3。因此,在定義函數(shù)的時(shí)候,即使不指定參數(shù)列表,仍然可以通過(guò)arguments引用到所獲得的參數(shù),這給編程帶來(lái)了很大的靈活性”。沒(méi)有比這句更加精辟的闡釋了。
看到這里,我們可能都有一個(gè)疑問(wèn)(如果你稍微具備一點(diǎn)js編程知識(shí)的話),arguments參數(shù)是不是js數(shù)組對(duì)象的一個(gè)實(shí)例?下面的代碼會(huì)幫你解決這個(gè)疑點(diǎn):
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();
}
代碼運(yùn)行結(jié)果是先彈出"test arguments"和"undefined",為什么funcArg調(diào)用返回“undefined”?看到這里相信你對(duì)上面的疑問(wèn)已經(jīng)消除。
到這里你以為你掌握了arguments的全部?那就太小瞧js的天才設(shè)計(jì)者(們)了,下面看另外一個(gè)有才的設(shè)計(jì):
Q:使用遞歸來(lái)計(jì)算1 到n 的自然數(shù)之和
A1:
function sum(n) {
if ( 1 == n) return 1 ;
else return n + sum(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁(yè)進(jìn)行執(zhí)行
} function sum(n) {
if ( 1 == n) return 1 ;
else return n + sum(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁(yè)進(jìn)行執(zhí)行
}
A2:
function sum(n) {
if ( 1 == n) return 1 ;
else return n + arguments.callee(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁(yè)進(jìn)行執(zhí)行
} function sum(n) {
if ( 1 == n) return 1 ;
else return n + arguments.callee(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁(yè)進(jìn)行執(zhí)行
}
A1和A2這兩個(gè)回答都解決了問(wèn)題,相信第一種方法是大多數(shù)人的常規(guī)做法,但是js推薦使用第二種,原書說(shuō)A1這種方式“其中函數(shù)內(nèi)部包含了對(duì) sum 自身的調(diào)用,然而對(duì)于JavaScript 來(lái)說(shuō),函數(shù)名僅僅是一個(gè)變量名,在函數(shù)內(nèi)部調(diào)用sum 即相當(dāng)于調(diào)用一個(gè)全局變量,不能很好的體現(xiàn)出是調(diào)用自身”,sum都調(diào)用sum了,還說(shuō)“不能很好的體現(xiàn)出是調(diào)用自身”,為什么呢?
書到用時(shí)方恨少,查書,書上是這么寫的:“arguments 對(duì)象的另一個(gè)屬性是callee,它表示對(duì)函數(shù)對(duì)象本身的引用,這有利于實(shí)現(xiàn)無(wú)名函數(shù)的遞歸或者保證函數(shù)的封裝性,”這話我承認(rèn)說(shuō)的有理,我從來(lái)都對(duì)書本尤其是技術(shù)類的書本保持高度的信任,可是這里說(shuō)“arguments 對(duì)象的另一個(gè)屬性是callee”,這里“arguments ”怎么成“對(duì)象”了?標(biāo)題都說(shuō)“傳遞給函數(shù)的隱含參數(shù):arguments ”,難道抄書抄錯(cuò)了?查看電子書,靠,復(fù)制粘貼還會(huì)有錯(cuò)?
對(duì)象,對(duì)象?對(duì)象何其多,下篇找"對(duì)象"。
不過(guò),代碼是廉價(jià)的(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頁(yè)進(jìn)行執(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頁(yè)進(jìn)行執(zhí)行
}
代碼運(yùn)行后怎么樣,不錯(cuò),這里的length實(shí)在是很奇怪,對(duì)不對(duì)?我們來(lái)看書中是怎么說(shuō)的,“代碼運(yùn)行時(shí)會(huì)依次顯示:1,2,1,2,3。因此,在定義函數(shù)的時(shí)候,即使不指定參數(shù)列表,仍然可以通過(guò)arguments引用到所獲得的參數(shù),這給編程帶來(lái)了很大的靈活性”。沒(méi)有比這句更加精辟的闡釋了。
看到這里,我們可能都有一個(gè)疑問(wèn)(如果你稍微具備一點(diǎn)js編程知識(shí)的話),arguments參數(shù)是不是js數(shù)組對(duì)象的一個(gè)實(shí)例?下面的代碼會(huì)幫你解決這個(gè)疑點(diǎn):
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();
}
代碼運(yùn)行結(jié)果是先彈出"test arguments"和"undefined",為什么funcArg調(diào)用返回“undefined”?看到這里相信你對(duì)上面的疑問(wèn)已經(jīng)消除。
到這里你以為你掌握了arguments的全部?那就太小瞧js的天才設(shè)計(jì)者(們)了,下面看另外一個(gè)有才的設(shè)計(jì):
Q:使用遞歸來(lái)計(jì)算1 到n 的自然數(shù)之和
A1:
function sum(n) {
if ( 1 == n) return 1 ;
else return n + sum(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁(yè)進(jìn)行執(zhí)行
} function sum(n) {
if ( 1 == n) return 1 ;
else return n + sum(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁(yè)進(jìn)行執(zhí)行
}
A2:
function sum(n) {
if ( 1 == n) return 1 ;
else return n + arguments.callee(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁(yè)進(jìn)行執(zhí)行
} function sum(n) {
if ( 1 == n) return 1 ;
else return n + arguments.callee(n - 1 );
}
function test() {
alert(sum( 100 )); ; // 放到html頁(yè)進(jìn)行執(zhí)行
}
A1和A2這兩個(gè)回答都解決了問(wèn)題,相信第一種方法是大多數(shù)人的常規(guī)做法,但是js推薦使用第二種,原書說(shuō)A1這種方式“其中函數(shù)內(nèi)部包含了對(duì) sum 自身的調(diào)用,然而對(duì)于JavaScript 來(lái)說(shuō),函數(shù)名僅僅是一個(gè)變量名,在函數(shù)內(nèi)部調(diào)用sum 即相當(dāng)于調(diào)用一個(gè)全局變量,不能很好的體現(xiàn)出是調(diào)用自身”,sum都調(diào)用sum了,還說(shuō)“不能很好的體現(xiàn)出是調(diào)用自身”,為什么呢?
書到用時(shí)方恨少,查書,書上是這么寫的:“arguments 對(duì)象的另一個(gè)屬性是callee,它表示對(duì)函數(shù)對(duì)象本身的引用,這有利于實(shí)現(xiàn)無(wú)名函數(shù)的遞歸或者保證函數(shù)的封裝性,”這話我承認(rèn)說(shuō)的有理,我從來(lái)都對(duì)書本尤其是技術(shù)類的書本保持高度的信任,可是這里說(shuō)“arguments 對(duì)象的另一個(gè)屬性是callee”,這里“arguments ”怎么成“對(duì)象”了?標(biāo)題都說(shuō)“傳遞給函數(shù)的隱含參數(shù):arguments ”,難道抄書抄錯(cuò)了?查看電子書,靠,復(fù)制粘貼還會(huì)有錯(cuò)?
對(duì)象,對(duì)象?對(duì)象何其多,下篇找"對(duì)象"。
您可能感興趣的文章:
- js的隱含參數(shù)(arguments,callee,caller)使用方法
- javascript內(nèi)置對(duì)象arguments詳解
- javascript 利用arguments實(shí)現(xiàn)可變長(zhǎng)參數(shù)
- JS函數(shù)動(dòng)態(tài)傳遞參數(shù)的方法分析【基于arguments對(duì)象】
- javascript arguments使用示例
- Javascript中arguments對(duì)象的詳解與使用方法
- JavaScript中使用arguments獲得函數(shù)傳參個(gè)數(shù)實(shí)例
- JS中call/apply、arguments、undefined/null方法詳解
- 深入理解JS函數(shù)的參數(shù)(arguments)的使用
- JavaScript中arguments的使用方法詳解
相關(guān)文章
通用javascript腳本函數(shù)庫(kù) 方便開(kāi)發(fā)
javascript 在 WEB 編程中能起到很大的作用,將一些常用的功能寫成javascript類庫(kù)。2009-10-10
微信小程序?qū)Ш綑诟S滑動(dòng)效果的實(shí)現(xiàn)代碼
這篇文章主要介紹了小程序?qū)Ш綑诟S滑動(dòng)效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05
小程序開(kāi)發(fā)基礎(chǔ)之view視圖容器
這篇文章主要介紹了小程序開(kāi)發(fā)基礎(chǔ)之view視圖容器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
JS中字符問(wèn)題(二進(jìn)制/十進(jìn)制/十六進(jìn)制及ASCII碼之間的轉(zhuǎn)換)
對(duì)于js的進(jìn)制轉(zhuǎn)換的一些方法分析2008-11-11
javascript如何動(dòng)態(tài)加載表格與動(dòng)態(tài)添加表格行
在某些時(shí)候需要?jiǎng)討B(tài)加載表格與動(dòng)態(tài)添加表格行,在接下來(lái)的文章中將為大家介紹下javascript是如何做到的,感興趣的朋友不要錯(cuò)過(guò)2013-11-11

