Javascript中的arguments對象
實參和形參的同步性
實參是存儲在arguments對象中拆火,arguments是一個類數(shù)組伏社,arguments對象的長度是由實參個數(shù)而不是形參個數(shù)決定的。形參是函數(shù)內(nèi)部重新開辟內(nèi)存空間存儲的變量,但是其與arguments對象內(nèi)存空間并不重疊浇垦。對于arguments和值都存在的情況下蹦锋,兩者值是同步的兆沙,但是針對其中一個無值的情況下,對于此無值的情形值不會得以同步莉掂。下面的截圖可以驗證
形參a與實參arguments[0]是對應(yīng)關(guān)系葛圃,改動其中一個,另外一個也會跟著改變憎妙。但是對于形參c和實參arguments[2]而言库正,因為實參有“1”、“2”尚氛,arguments[2]并沒有賦值诀诊,所以arguments[2]為undefined,在函數(shù)中將arguments[2]對應(yīng)的形參c賦值為2012后阅嘶,arguments[2]仍為undefined属瓣。
arguments的callee屬性
callee屬性在函數(shù)的遞歸當中較常出現(xiàn),下面對比一下遞歸中使用callee和不使用callee的區(qū)別
不使用callee的遞歸寫法:
以下代碼可導(dǎo)致出錯:
var tempCount = count;
count = null;
alert(tempCount(3)); //出錯
由于tempCount和count本質(zhì)只是指向函數(shù)的指針讯柔,在執(zhí)行tempCount(3)時抡蛙,函數(shù)體內(nèi)會調(diào)用count指向的函數(shù),而count已經(jīng)被置為null魂迄,count不指向函數(shù)了粗截,所以出錯。
用arguments.callee可解決問題捣炬,這是一個指向正在執(zhí)行的函數(shù)的指針熊昌。
使用callee的遞歸寫法:
var tempCount = count;
count = null;
alert(tempCount(4)); //結(jié)果為24.
補充:1.函數(shù)沒有重載,只有覆蓋湿酸,2.事件函數(shù)婿屹,有默認參數(shù)event
在js中有兩個原因?qū)е聸]有函數(shù)重載,一:函數(shù)沒有返回值類型這一說法推溃,二:形參只是用來在函數(shù)中方便調(diào)用的昂利,編譯并不檢查傳參,實參是存儲在arguments對象中。對此舉個例:
由此可以看出蜂奸,調(diào)用的始終是后面的申明的函數(shù)犁苏。
對于事件函數(shù)的默認參數(shù)event問題,貼一段代碼:
對應(yīng)的打永┧:
其實有些人對上面的函數(shù)開始會有這樣的第一反應(yīng):arguments.length = 2, arguments里面是foo和1000围详,但是,仔細觀察一下碌奉,發(fā)現(xiàn)arguments是返回的匿名函數(shù)的arguments短曾,而不是debounce的arguments。匿名函數(shù)并沒有任何形參也沒有明顯傳遞實參赐劣,但是打印出的arguments.length = 1,并且打印出的這個實參是event嫉拐。這是因為debounce函數(shù)執(zhí)行后,返回的匿名函數(shù)作為window的mousemove函數(shù)魁兼,事件函數(shù)里面會有一個默認的參數(shù)event婉徘,這是事件函數(shù)特有的情況,但是如果是一個普通的匿名函數(shù)咐汞,就不會有默認的event參數(shù)盖呼。