JS中的函數(二):函數參數(你可能不知道的參數傳遞)


前言:

函數分為有參有返回值,有參無返回值,無參無返回值,無參有返回值;那么對於無參數的函數你想使用函數的調用怎么辦呢?如果你想封裝一個代碼,實現多種功能,但是形參大於實參或者實參大於形參又該如何?本文就發生函數調用過程中,值傳遞,參數的不對等處理原則等關於參數的一些相關操作進行闡述。

1.實參數大於形參數:

 

 function say(name,message){

    console.log('Hello' + name + message);

  }

  say('World!','ByeBye!','World’);

//控制台打印出:HelloWorld!ByeBye!

 

2.實參數小於形參數:

 

function say(name,message){

    console.log('Hello' + name + message);

  }

  say('World!’);

//控制台打印出:HelloWorld!undefined

 

在JS中變量定義的時候,如果未給一個變量賦初值那么該變量的類型為undefiend

細心的可以發現一個規律,就是在進行函數調用的時候,不管實參的數目大於形參還是小於形參被調用的函數都會執行;在JS中函數不介意傳遞進來多少個參數,也不在乎傳進來的參數是什么數據類型。發生函數調用的時候可以給一個實參也可以給多個實參,之所以會這樣,是因為在js中的參數在內部是用一個數組來表示。函數接收到的始終是這個數組,而不關心數組中包含哪些參數,如果這個數組不包含任何參數也無所謂,包含多個參數也沒問題,在函數體內可以通過arguments(參數)對象來訪問這個參數數組,從而獲取傳遞給參數的每個參數。 arguments對象和數組對象相類似,可以通過下標來獲取傳入的每一個元素(第一個元素是arguments[0]);也可以使用length屬性來確定傳遞進來多少個參數。

3.通過arguments 來實現函數參數的“調用”:

對於上面的代碼可以這樣寫:

  function say(name, message){

      console.log('Hello' + arguments[0] + arguments[1]);

      console.log(arguments.length);

    }
say(
'World!', 'ByeBye!’);

或者

function say(){

    console.log('Hello' + arguments[0] + arguments[1]);

    console.log(arguments.length);

  }

  say('World!', 'ByeBye!’);

控制台打印效果都是一樣的;即:HelloWorld!ByeBye!

即:在這里你可以這樣理解;當發生函數調用的時候,實參被保存在叫做arguments的“數組”當中;而arguments中對應下標的值在發生函數調用的時候始終與被調用函數的參數保持;

對於這個可采用如下方法驗證:

function say(name, message){

      console.log(arguments[1] == message);

      arguments[1] = 'World!';

      console.log(arguments[1] == message);

    }

    say('World!', 'ByeBye!’);

//控制台打印:true;true;

不過並不是說讀取這兩個值會訪問相同的內存空間,他們的內存空間是獨立的,但他們的值會同步,這種同步是單向的,也就是參數的改變不會改變argumens中對應的值。

function say(name, message){

      console.log(arguments.length);

    }

    say('World!');

//控制打印:1;

arguments對象的長度是由傳入的參數個數決定,不由定義函數的參數的個數決定。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM