ecmascript標準中,每個函式都有乙個特殊的內建物件arguments。arguments物件是乙個類array物件(object),用以儲存函式接收到的實參副本。
一、內建特性
說它是乙個內建物件是因為我們在建立函式時並沒有定義這個物件:
var functest =function(args)
}functest(『a』);
console.log(functest.arguments);
直接呼叫functest.arguments輸出的結果是null,這一點更可以說明arguments的內建性,當函式開始執行時才能呼叫到該物件。
二、arguments儲存的是函式的實參副本
在宣告乙個函式時,函式內部會開闢記憶體空間用以儲存形式引數的變數(指標),這一過程是在定義函式時完成的;而arguments是依據傳入的實參而開闢記憶體空間用以儲存實參副本,這一過程是在呼叫函式時發生的。兩者並沒有在同一記憶體空間中儲存變數的值。
1,當實參數量等於形參數量時,兩者中的值是同步的:
function functest(a,b)
functest(『1』,'2』);
2,有時它們的值並不同步:
function functest(a,b,c)
functest(『1』,'2』);
arguments物件根據傳入的實參順序來與實參的值進行同步,如果該順序(index)中沒有傳入實參則不同步。
3,僅僅是儲存實參的副本:
function functest(a,b)
functest(『1』,』2』);
在使用arguments物件時, 在函式內部並不能通過使用arguments[n]的形式來開闢新的記憶體空間用以儲存變數的值,也不能通過該方法增加arguments中的變數數。arguments在函式被呼叫後即開闢記憶體空間,該空間數目依據實參數量而來,不可更改。
三、arguments的屬性
1,length屬性
arguments.length返回物件中儲存的變數的長度
2,callee 方法
arguments.callee返回函式自身的引用
var functest=function()
arguments.callee指向函式自身的引用,這在使用匿名函式時會比較有用。
我們可以利用arguments.callee來建立乙個遞迴函式:
function functest(n)else
}
也可以用來判斷引數數目:
function functest(a,b)
}
四、將arguments物件轉換成陣列(array)
開篇語裡提到arguments物件是乙個類陣列物件,是因為它有一些特性和陣列很相似,比如有length的屬性和類似陣列的索引器訪問內部變數的特性。但實際上它並不是乙個真正的陣列。我們可以通過下面的方式將它轉換成乙個真正的陣列:
var arr=array.prototype.slice.call(arguments);
JavaScript中的函式
函式的宣告 方式一 js的 宣告區域和執行區域是一起的,都是在js 的 域中 function 函式名 形參名 1,形參名2 function test1 a1,a2 test1 1 2 方式二 根據底層都是物件,函式底層也都是物件 var 函式名 new function 形參1 形參2 函式體 ...
javascript中的eval函式
eval 只有乙個引數,如果傳入的引數不是字串,則直接返回這個引數。否則會將字串當成js 進行編譯,如果編譯失敗則丟擲語法錯誤 syntaxerror 異常。如果編譯成功則開始執行這段 並返回字串中的最後乙個表示式或語句的值 如果最後乙個表示式或語句沒有值,則最終返回undefined。如果字串丟擲...
javaScript中函式的引數
函式不介意傳遞進來多少個引數,也不在乎傳進來引數是什麼資料型別,原因是 ecmascript 中的引數在內部是用乙個陣列來表示的。函式接收到的始終都是這個陣列,而不關心陣列中包含哪些引數 如果有引數的話 在函式體內可以通過 arguments 物件來訪問這個引數陣列,從而獲取傳遞給函式的每乙個引數,...