深入解析JavaScript中的arguments對象
arguments定義
所有的函數(shù)都有一個自己的arguments對象,用來儲存它實際接受到的參數(shù),而不局限于函數(shù)聲明時所定義的參數(shù)列表。它不是數(shù)組卻類似數(shù)組,具有數(shù)組一樣的訪問性質(zhì)及方式,可以由arguments[n]來訪問對應(yīng)的單個參數(shù)的值,并擁有數(shù)組長度屬性length。但是卻不具有數(shù)組的一些方法??梢酝ㄟ^call把arguments轉(zhuǎn)化成真正的數(shù)組,然后進行數(shù)組的操作。
var args = Array.prototype.slice.call(arguments);
類數(shù)組
1. 判斷ARGUMENTS是不是數(shù)組
alert(arguments instanceof Array); alert(arguments instanceof Object);
2. 如何嚴格的判斷一個數(shù)據(jù)是數(shù)組(ARRAY)類的實例
function isArray(value){
if (typeof Array.isArray === "function") {
return Array.isArray(value);
}else{
return Object.prototype.toString.call(value) === "[object Array]";
}
}
3. 把ARGUMENTS轉(zhuǎn)換成數(shù)組
方法一:內(nèi)置的類型可以通過prototype找到內(nèi)置的屬性方法,Array.prototype.slice就是訪問Array的內(nèi)置方法slice。通過slice方法,返回一個數(shù)組。call是調(diào)用一個對象的方法,以另外一個對象替換當(dāng)前對象。
var arg = Array.prototype.slice.call(arguments,0);
方法二:比方法一性能要差一點,因為它是先創(chuàng)建一個數(shù)組,然后再進行的
var arg = [].slice.call(arguments,0);
方法三:通過循環(huán)轉(zhuǎn)變成數(shù)組
function toArray(arguments){
var a = [];
for(var i=0;i<arguments.length;i++){
a.unshift(arguments.[i]);
}
return a;
}
caller
當(dāng)一個函數(shù)被另一個函數(shù)調(diào)用的時候,被調(diào)用的函數(shù)會自動生成一個caller屬性,指向調(diào)用它的函數(shù)對象,如果函數(shù)未被調(diào)用,則caller為null。
function testCaller() {
var caller = testCaller.caller;
alert(caller);
}
function aCaller() {
testCaller();
}
aCaller();
彈出的是函數(shù)aCaller的內(nèi)容。
arguments.callee
arguments.callee指向正在運行的函數(shù)自身,返回正被執(zhí)行的 Function 對象,也就是所指定的 Function 對象的正文。
注意:arguments.length是實參長度,arguments.callee.length是形參長度,通常用來判斷形參與實參長度是否一致
通過arguments獲得函數(shù)的實參,通過arguments.callee獲得函數(shù)的形參。
在閉包中應(yīng)用的也比較廣泛。
var i = 0;
function b(num) {
if (num < 10) {
num++;
i++;
//如果有參數(shù),callee也要把參數(shù)帶上;
arguments.callee(num);
} else {
//輸出2次
alert("調(diào)用了"+i+"次callee!");
}
}
b(8);
Arguments.callee在閉包中的應(yīng)用,它提供了一種遞歸調(diào)調(diào)用的功能。
//用arguments.callee計算10的階乘,例如: 1×2×3×4×5×6×7....
function c(x) {
return x > 1 ? x * arguments.callee(x - 1) : 1
} (10);
//輸出6
alert(c(3));
//輸出3628800
alert(c(10));
例:callee求1-n的和
function fn(n){
if(n==1) return n;
else return n+arguments.callee(n-1);
}
它可以讓一個匿名函數(shù)自己調(diào)用自己
例:
function list(type){
var result = "<"+type+"l><li>";
var args = Array.prototype.slice.call(arguments,1);
result += args.join("</li><li>");
result += "</li></"+type+"l>";
return result;
}
var listHtml = list("o","one","two");
console.log(listHtml);
例2:面試題:下面的console.log結(jié)果是[1,2,3,4]的是?
function foo(x){
console.log(arguments);
return x;
}
foo(1,2,3,4);
function foo(x){
console.log(arguments);
return x;
}(1,2,3,4)
在預(yù)解釋的時候,function fn(){}(1);會被分開處理,分成兩個函數(shù),第一個是function fn() {},而第二個則為匿名函數(shù):(1)。如果第二個不帶參數(shù),就會報錯,但是上面的函數(shù)包含在一個()里面,則是正確的。
(function fn(){
console.log(arguments);
}(1,2,3,4));
(function foo(x){
console.log( arguments);
return x;
})(1,2,3,4)
function foo(){
bar.apply(null,arguments);
}
function bar(x){
console.log(arguments);
}
foo(1,2,3,4);
相關(guān)文章
javascript開發(fā)技術(shù)大全 第2章 開始JAVAScript之旅
1st JavaScript Editor ,除了有著色處,還有html標(biāo)簽、屬性、javascript事件、函數(shù),另外還可調(diào)用外部編輯來編輯網(wǎng)頁,也可將常用瀏覽器內(nèi)置在窗口中。2011-07-07
JavaScript fontcolor方法入門實例(按照指定的顏色來顯示字符串)
這篇文章主要介紹了JavaScript fontcolor方法入門實例,fontcolor方法用于按照指定的顏色來顯示字符串,需要的朋友可以參考下2014-10-10
parentElement,srcElement的使用小結(jié)
本篇文章主要是對parentElement,srcElement的使用進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01
Javascript基礎(chǔ)_簡單比較undefined和null 值
下面小編就為大家?guī)硪黄狫avascript基礎(chǔ)_簡單比較undefined和null 值。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06
JavaScript中setUTCFullYear()方法的使用簡介
這篇文章主要介紹了JavaScript中setUTCFullYear()方法的使用簡介,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-06-06

