在js中一切都是對象撇簿,連函數(shù)也是對象恢口,函數(shù)名其實是引用函數(shù)定義對象的變量孝宗。
1、什么是arguments耕肩?
這個函數(shù)體內(nèi)的arguments非常特殊因妇,實際上是所在函數(shù)的一個內(nèi)置類數(shù)組對象问潭,可以用數(shù)組的[i]和.length。
2婚被、有什么作用狡忙?
js語法不支持重載!但可用arguments對象模擬重載效果址芯。
arguments對象:函數(shù)對象內(nèi)灾茁,自動創(chuàng)建的專門接收所有參數(shù)值得類數(shù)組對象。
arguments[i]: 獲得傳入的下標(biāo)為i的參數(shù)值
arguments.length: 獲得傳入的參數(shù)個數(shù)谷炸!
重載的定義是指函數(shù)的方法名相同北专,但參數(shù)不同。比如我寫兩個關(guān)于js的同名函數(shù):
輸出結(jié)果為NaN ?9旬陡,這就說明后面的函數(shù)把前一個同名函數(shù)覆蓋掉了拓颓,從而可以得出js函數(shù)不存在重載,永遠(yuǎn)調(diào)用最后一個方法描孟。
雖說JS函數(shù)不存在重載驶睦,但是我們可以實現(xiàn)js里面的模擬重載,接下來見證奇跡的時刻到了画拾。要想實現(xiàn)js模擬重載必先回用到 arguments.用來存放js參數(shù)啥繁。實現(xiàn)方法如下:
上述例子中本意是想讓同名函數(shù)sum()根據(jù)參數(shù)不同輸出不同結(jié)果,但是sum是函數(shù)名字青抛,本質(zhì)也是個變量旗闽,
第二個會覆蓋第一個,所以上述的正確輸出答案是:NaN,9.所以這樣顯然不可以蜜另。
如果用arguments,就簡單多了适室。
如下2個例子:
//2、
? ? function calc(){
? ? ? ? //如果用戶傳入一個參數(shù)举瑰,求平方
? ? ? ? if(arguments.length==1){
? ? ? ? ? ? console.log(arguments[0]*arguments[0]);
? ? ? ? }else if(arguments.length==2){
? ? ? ? //如果用戶傳入兩個參數(shù)捣辆,就求和
? ? ? ? ? ? console.log(arguments[0]+arguments[1]);
? ? ? ? }
? ? }
? ? calc(4); //16
? ? calc(4,5); //9
/*3、無論用戶傳入幾個數(shù)字此迅,都可以求和*/
? ? function add(){
? ? ? ? //arguments:[]
? ? ? ? //遍歷arguments中每個元素汽畴,并累加
? ? ? ? for(var i=0,sum=0;i<arguments.length;sum+=arguments[i++]);
? ? ? ? return sum;//返回和
? ? }
? ? console.log(add(1,2,3)); //6
? ? console.log(add(1,2,3,4,5,6)); //21
這就是JS利用arguments重載的效果,簡單理解就是一個函數(shù)重復(fù)利用.
arguments.length是有實參決定耸序,即函數(shù)調(diào)用時候里面的參數(shù)個數(shù)決定忍些!
其實Javascript并沒有重載函數(shù)的功能,但是Arguments對象能夠模擬重載坎怪。Javascrip中國每個函數(shù)都會有一個Arguments對象實例arguments罢坝,它引用著函數(shù)的實參,可以用數(shù)組下標(biāo)的方式"[]"引用arguments的元素搅窿。arguments.length為函數(shù)實參個數(shù)嘁酿,arguments.callee引用函數(shù)自身隙券。
arguments他的特性和使用方法
特性:
arguments對象和Function是分不開的。因為arguments這個對象不能顯式創(chuàng)建闹司,arguments對象只有函數(shù)開始時才可用娱仔。
使用方法:
雖然arguments對象并不是一個數(shù)組,但是訪問單個參數(shù)的方式與訪問數(shù)組元素的方式相同
例如:
arguments[0],arguments[1],开仰。拟枚。。众弓。恩溅。。谓娃。脚乡。arguments[n],
在js中?不需要明確指出參數(shù)名,就能訪問它們滨达,例如:
function?test(){
var s;?????
for(int i=0奶稠;i<arguments.length;i++)
??? {
s+=arguments[i]+",";
???? }
return s;
}
test("name","age")
輸出結(jié)果:
name,age
我們知道每一個對象都有自己的屬性,arguments對象也不例外捡遍,首先arguments的訪問猶如Array對象一樣锌订,
用0到arguments.length-1來枚舉每一個元素。下面我們來看看callee屬性画株,返回正被執(zhí)行的?Function對象辆飘,
也就是所指定的?Function?對象的正文。callee?屬性是?arguments?對象的一個成員谓传,僅當(dāng)相關(guān)函數(shù)正在執(zhí)行時才可用蜈项。
callee?屬性的初始值就是正被執(zhí)行的?Function?對象,這允許匿名的遞歸函數(shù)续挟。
var?sum=function(n){
???if(1==n)?{
?return?1;
?? }?else?{
return?n?+?arguments.callee(n-1);
}
}
alert(sum(6));
?通俗一點就是紧卒,arguments此對象大多用來針對同個方法多處調(diào)用并且傳遞參數(shù)個數(shù)不一樣時進行使用。根據(jù)arguments的索引來判斷執(zhí)行的方法诗祸。