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物件的長度是由傳入的引數個數決定,不由定義函式的引數的個數決定。