函數(shù)的定義
第一種:
function abs(x){
if (x >= 0) {
return x;
} else {
return -x;
}
}
由于JavaScript的函數(shù)也是一個(gè)對(duì)象,上述定義的abs()函數(shù)實(shí)際上是一個(gè)函數(shù)對(duì)象,而函數(shù)名abs可以視為指向該函數(shù)的變量。所以有了第二種定義方式。
第二種:
var abs=function(x){
if (x >= 0) {
return x;
} else {
return -x;
}
}; //按照完整語法需要在函數(shù)體末尾加一個(gè);,表示賦值語句結(jié)束。
這種方式下,該函數(shù)是一個(gè)匿名函數(shù),但是賦值給了變量abs,因此可以通過變量abs來調(diào)用該函數(shù)。
函數(shù)的調(diào)用
調(diào)用時(shí),按順序傳入?yún)?shù)即可。
由于JavaScript允許傳入任意個(gè)參數(shù)而不影響調(diào)用,因此傳入的參數(shù)比定義的參數(shù)多也沒有問題,雖然函數(shù)內(nèi)部并不需要這些參數(shù):
傳入的參數(shù)少哪?
abs()//此時(shí)abs(x)函數(shù)的參數(shù)x將收到undefined,計(jì)算結(jié)果為NaN。
要避免收到undefined,可以對(duì)參數(shù)進(jìn)行檢查:
function abs(x) {
if (typeof x !== 'number') {
throw 'Not a number';
}
if (x >= 0) {
return x;
} else {
return -x;
}
}
arguments
關(guān)鍵字arguments的作用域是 函數(shù)內(nèi)部,永遠(yuǎn)指向傳入函數(shù)的參數(shù)。arguments類似于Array但不是Array。
使用方法:
function abs(){
if(arguments.length == 0){
return 0;
}
var temp = arguments[0];
return temp >= 0 ? temp:-temp;
}
abs();//返回0;
abs(9);//返回9;
abs(-9);//返回9;
應(yīng)用場(chǎng)景:常用于判斷傳入?yún)?shù)的個(gè)數(shù)。
//foo(a, [b], c)
//接受2-3個(gè)參數(shù),其中第二個(gè)參數(shù) b 是可選參數(shù);
function foo(a, b, c){
if(arguments.length === 2){
//實(shí)際拿到的參數(shù)是a和b,c是undefined;
c = b;//將b的值賦給c;
b = null;//把b變成默認(rèn)值;
}
...//函數(shù)的具體實(shí)現(xiàn);
}
//要想把中間的可選參數(shù)b變成默認(rèn)值,只能通過`arguments`進(jìn)行轉(zhuǎn)換;
rest
rest參數(shù)有ES6標(biāo)準(zhǔn)引入。作用是獲取除了已定義的參數(shù)之外的所有參數(shù)。
使用方法:
function foo(a, b, ...rest){
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
foo(1, 2, 3, 4, 5);
//a = 1, b = 2, c = Array[3, 4, 5];
foo(1);
//a = 1, b = undefined, Array[];
rest要寫在所有參數(shù)的最后,前面加上三個(gè)點(diǎn)...,前兩個(gè)參數(shù)綁定到a,b上,其余所有的參數(shù)以數(shù)組的形式,傳給變量rest。