javascript內(nèi)置對象arguments詳解
一、什么是arguments
arguments 是是JavaScript里的一個內(nèi)置對象,它很古怪,也經(jīng)常被人所忽視,但實(shí)際上是很重要的。所有主要的js函數(shù)庫都利用了arguments對象。所以agruments對象對于javascript程序員來說是必需熟悉的。
所有的函數(shù)都有屬于自己的一個arguments對象,它包括了函所要調(diào)用的參數(shù)。他不是一個數(shù)組,如果用typeof arguments,返回的是'object'。雖然我們可以用調(diào)用數(shù)據(jù)的方法來調(diào)用arguments。比如length,還有index方法。但是數(shù) 組的push和pop對象是不適用的。
二、創(chuàng)建一個靈活的函數(shù)
看起來貌似argument對象使用起來十分有限,但是實(shí)際上它是一個非常有用的對象。你可以通過使用argument對象讓函數(shù)能夠調(diào)用數(shù)量不定 的參數(shù)。在Dean Edwards的base2庫里有個格式化的函數(shù),展示了這個靈活性。
var args = arguments;
var pattern = new RegExp(“%([1-" + arguments.length + "])”, ”g”);
return String(string).replace(pattern, function(match, index) {
return args[index];
});
};
我們提供了一個模板字符串,你可以用”%1”到“%9”給返回值添加一個占位符。然后提供給九個其他參數(shù)插入。
上面的代碼將返回:And the papers want to know whose shirt you wear" .
有件事情我們需要注意下,在定義函數(shù)的時候,我們只規(guī)定了一個參數(shù),string。Javascript允許我們傳遞任何數(shù)量的參數(shù)到一個函數(shù)里,不管怎么定義這個函數(shù)。Arguments對象對這些都是允許的。
三、把a(bǔ)rguments對象轉(zhuǎn)換成一個真正的數(shù)組
雖然arguments對象不是一個真正的javascript數(shù)組,但是我們還是可以輕易的把它轉(zhuǎn)換成標(biāo)準(zhǔn)的數(shù)據(jù) ,然后進(jìn)行數(shù)組操作。
那么現(xiàn)在這個變量args就含有一個含有函數(shù)所有參數(shù)的標(biāo)準(zhǔn)javascript數(shù)組對象。
四、通過預(yù)置的arguments對象創(chuàng)建函數(shù)
Arguments對象允許我們?nèi)?zhí)行所有類型的javascript方法。這邊附上一個makeFunc函數(shù)的定義。這個函數(shù)允許我們?nèi)ヌ峁┮粋€函數(shù)引用和這個函數(shù)的所有參數(shù)。他將返回一個匿名函數(shù)去調(diào)用你規(guī)定的函數(shù),也提供了匿名函數(shù)調(diào)用時所附帶的參數(shù)。
var args = Array.prototype.slice.call(arguments);
var func = args.shift();
return function() {
return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));
};
}
第一個argument對象給makeFunc提供了你想調(diào)用的函數(shù)的引用。他是從arguments數(shù)組里移除的。然后makeFunc返回了一個匿名函數(shù)去運(yùn)行規(guī)定的方法。
第一個應(yīng)用的argument指向了函數(shù)調(diào)用的范圍,主要是函數(shù)內(nèi)部關(guān)鍵部分所指向的。我們先保持這個為null。第二個arguments是一個 數(shù)組,會為這個函數(shù)轉(zhuǎn)變?yōu)閍rguments對象。makeFunc把原始的數(shù)組值串聯(lián)到arguments對象里提供給匿名函數(shù)和所調(diào)用函數(shù)的數(shù)組。
你需要輸出一個模板總是相同的位置,這樣就可以不用總是在每次引用模板的時候調(diào)用format函數(shù)。你可以使用makeFunc的通用功能去返回可以調(diào)用format然后自動補(bǔ)充模板的函數(shù)。
你可以像這樣調(diào)用majorTom函數(shù):
majorTom(“floating in a most peculiar way”);
每一次你調(diào)用majorTom,它會同時調(diào)用format函數(shù)和第一個argument,已經(jīng)寫好的模板。那么將返回
“This is Major Tom to ground control. I'm floating in a most peculiar way.”
五、創(chuàng)建引用自身的函數(shù)
你可能覺得這樣很酷,不過,arguments還有更多的驚喜。他還有其他有用的特性:callee方法 。Arguments.callee包括了一個函數(shù)的引用去創(chuàng)建一個argument對象。那么該如何使用呢?
Arguments.callee方法能讓一個匿名函數(shù)很方便的指向本身。
Repeat是一個承載了一個函數(shù)引用和兩個數(shù)字的函數(shù)。第一個數(shù)字是函數(shù)調(diào)用幾次,第二個數(shù)字是每個調(diào)用的間隔時間,單位是毫秒。
return function() {
if(times– > 0) {
fn.apply(null, arguments);
var args = Array.prototype.slice.call(arguments);
var self = arguments.callee;
setTimeout(function(){self.apply(null,args)}, delay);
}
};
}
Repeat函數(shù)使用了arguments.callee方法從變量self去獲取一個引用,指向運(yùn)行原始指令的函數(shù)。這樣,匿名函數(shù)就可以再次調(diào)用本身。
我有一段超級簡介的函數(shù),承載了一個字符串和執(zhí)行alert方法。
alert(s);
}
然而,我想創(chuàng)建一個特殊的版本,通過這個版本我可以重復(fù)這個動作三次,每次間隔2秒鐘。那么,我們可以
somethingWrong(“Can you hear me, major tom?”);
調(diào)用了somethingWrong函數(shù)的結(jié)果就是復(fù)這個動作三次,每次alert間隔2秒鐘。
Arguments雖然不是經(jīng)常用到,有點(diǎn)古怪,但是,它充滿了驚喜,非常值得我們?nèi)チ私?。
- js的隱含參數(shù)(arguments,callee,caller)使用方法
- javascript arguments 傳遞給函數(shù)的隱含參數(shù)
- javascript 利用arguments實(shí)現(xiàn)可變長參數(shù)
- JS函數(shù)動態(tài)傳遞參數(shù)的方法分析【基于arguments對象】
- javascript arguments使用示例
- Javascript中arguments對象的詳解與使用方法
- JavaScript中使用arguments獲得函數(shù)傳參個數(shù)實(shí)例
- JS中call/apply、arguments、undefined/null方法詳解
- 深入理解JS函數(shù)的參數(shù)(arguments)的使用
- JavaScript中arguments的使用方法詳解
相關(guān)文章
第一個JavaScript入門基礎(chǔ) document.write輸出
關(guān)于JavaScript,他是一個OOSP(面向?qū)ο竽_本語言)他是用來創(chuàng)建動態(tài)網(wǎng)站,增強(qiáng)用戶界面的一門技術(shù)。如果你想了解更多關(guān)于JavaScript的信息,請去維基百科查詢。2010-02-02Javascript實(shí)例教程(19) 使用HoTMetal(1)
Javascript實(shí)例教程(19) 使用HoTMetal(1)...2006-12-12javascript實(shí)現(xiàn)的一個隨機(jī)點(diǎn)名功能
這篇文章主要介紹了JS實(shí)現(xiàn)的一個隨機(jī)點(diǎn)名功能,邏輯簡單,用在班級或活動時是個不錯的選擇,需要的朋友可以參考下2014-08-08在javascript中創(chuàng)建對象的各種模式解析
下面小編就為大家?guī)硪黄趈avascript中創(chuàng)建對象的各種模式解析。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧2016-05-05詳解Javascript ES6中的箭頭函數(shù)(Arrow Functions)
箭頭函數(shù),若有了解過coffeeScript的同學(xué),或許對此印象深刻,因?yàn)樗梢宰屨Z法省略不少,特別是對于回調(diào)函數(shù),會讓代碼更清晰簡潔。下面讓我們一起來學(xué)習(xí)學(xué)習(xí)ES6中的箭頭函數(shù)。2016-08-08