函數學習之參數(arguments對象)

函數聲明語句:function f(x){},其中x就是參數。javascript

參數分爲兩種:html

  • 形參(parameter):函數定義時圓括號裏的數據。
  • 實參(arguments);函數調用時,傳給函數做爲參數的數據。

EMCAScript規定在調用函數時,可傳入任意數量,任意類型的參數,能夠不跟函數定義時傳入的形參數量相對應。爲何會這樣呢?java

緣由就是,EMACAScript中的參數在內部是用一個數組來表示的,函數接收的始終是這個數組,而不關心包含哪些參數。並且,在函數體內也能夠經過arguments這個對象來訪問這個參數數組,從而獲取傳遞給函數的每個參數。(arguments就是一個對象--函數的一個內部對象,和this同樣。)所以arguments看起來就像一個類數組了。能夠用arguments[n]來訪問各個位置的元素了.數組

 

要了解arguments對象,就須要先函數的內部屬性。函數

函數內部,有兩個特殊對象:arguments 和 this。this

arguments是一個類數組對象,包含着傳入函數中的全部參數。該對象有一個屬性callee,該屬性是一個指針,指向擁有這個arguments對象的函數。經典例子是階乘函數:spa

 
 1 function factorial(num){
 2     if(num <= 1){
 3         return 1;
 4     }else{
 5         return num * factorial(num-1);
 6     }
 7 }
 8 
 9 //修改一下,消除函數的執行與函數名緊密的耦合在一塊兒,
10 function factorial(num){
11     if(num <= 1){
12         return 1;
13     }else {
14         return num * arguments.callee(num-1);
15     }
16 }
17 
18 //修改後函數名factorial就沒出如今函數體內部,所以,不管引用函數時使用什麼名字,都能保證正常完成遞歸。
19 //例如
20 var trueFactorial = factorial;
21 factorial = function(){
22     return 0;
23 };
24 alert(trueFactorial(5));  //120
25 alert(factorial(5));   //0
26 //在上面的例子裏,變量trueFactorial 得到了factorial的值,實際上就是在另外一個位置上保存了一個指向函數的指針,就是讓另外一個變量也能夠應用該函數,正如在函數定義時說的,函數名是一個指向函數的指針,函數體自己存在那裏,經過函數名能夠訪問罷了,兩者相互獨立,又存在某種聯繫。
27 //而後將一個返回0的新函數賦給變量factorial。若是在函數體內有變量名factorial,如第一個例子,則trueFactorial()就會返回0.但改爲arguments.callee後就可以讓trueFactorial正常計算。
 

與callee屬性對應的就是caller屬性,arguments對象也擁有caller屬性,即:arguments.caller。但在嚴格模式下訪問它會報錯,而在非嚴格模式下這個屬性始終是undefined。該屬性主要就是爲了分清arguments.caller和函數的caller屬性。函數的caller屬性指向調用該函數的外部函數。指針

arguments.callee.caller 和函數的caller屬性等效。code

 
function outer(){
    inner();
}
function inner(){
    alert(inner.caller);  //等價於alert(arguments.callee.caller);
}
outer();   //返回outer函數的代碼
 

 

arguments還有一個length屬性,返回傳入參數的個數。和Array.length相似。htm

 

前面說的在函數內部能夠經過arguments對象訪問傳入的參數。那也能夠和命名參數一塊兒在函數內部使用:

 
function doAdd(num1,num2){
    if(arguments.length == 1){
        alert(num1 + 10);
    }else if(arguments.length == 2){
        alert(arguemnts[0] + num2);
    }
}
 

還有一點。arguments的值永遠與對應的命名參數保持同步:

1
2
3
4
function  doAdd(num1,num2){
     arguments[1] = 10;
     alert(arguments[0] + num2);
}

  什麼意思呢?就是每次執行這個函數時,裏面的arguments[1]都會被設成10,對應的num2也會跟着變着10。

最後一點:沒有傳遞值的命名參數將自動被賦予undefined,就像變量沒有初始化同樣。

關於函數定義時的參數,其實就像在函數內部定義的變量同樣,只不過不用在顯性的使用var來進行定義。

來源:https://www.cnblogs.com/liurenxingyu/p/5118724.html

相關文章
相關標籤/搜索