定義函數(shù):
-
function
指出這是一個函數(shù)定義痕届; -
abs
是函數(shù)名稱恨闪; -
(x)
括號內(nèi)列出函數(shù)的參數(shù)埃疫,多個參數(shù)以,
隔開 -
{...}
之間的代碼是函數(shù)體,可以包含若干語句纠脾,甚至可以沒有任何語句
function abs(x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
第二種定義函數(shù)的方式如下:
var abs = function (x) {
if (x >= 0) {
return x;
} else {
return -x;
}
}
調(diào)用函數(shù)
abs(20); // 返回20
abs(-9); // 返回9
由于JavaScript允許傳入任意個參數(shù)而不影響調(diào)用玛瘸,因此傳入的參數(shù)比定義的參數(shù)多一沒有問題蜕青,雖然函數(shù)內(nèi)部并不需要這些參數(shù)
abs(10, 'blalala'); // 返回10
abs(-9, 'haha', 'hehe', null); // 返回 9
傳入的參數(shù)比定義的少也沒有問題
abs(); // 返回 NaN, 此時,abs(x)函數(shù)的參數(shù)x接收到的undefeated糊渊,計算結果為NaN
要避免undefeated
市咆,可以對參數(shù)進行檢查
function abs(x) {
if (typeof x != 'number') {
throw 'Not a number';
}
if (x >= 0) {
return x;
} else {
return -x;
}
}
arguements
JavaScript還有一個免費贈送的關鍵字`arguments`,它只在函數(shù)內(nèi)部起作用再来,蒙兰,并且永遠指向當前函數(shù)的調(diào)用者傳入的所有參數(shù)。`arguments`類似`Array`但它不是一個`Array`
function foo(x) {
alert(x); // 10
for (var i = 0; i<arguements.length; i++) {
alert(arguements[i]); // 10, 20, 30
}
}
foo(10, 20, 30);
利用argumens
芒篷,你可以獲得調(diào)用者傳入的所有參數(shù)搜变。也就是說,即使函數(shù)不定義任何參數(shù)针炉,還是可以拿到參數(shù)的值
function abs() {
if (arguements.length == 0) {
return 0;
}
var x = arguements[0];
return x >= 0? x : -x;
}
abs(); // 0
abs(10); // 10
abs(-9); // 9
arguments
最常用于判斷傳入?yún)?shù)的個數(shù):
// foo([a[, b], c])
// 接收2-3個參數(shù)挠他,b是可選參數(shù),如果只傳2個參數(shù)篡帕,b默認為null:
// 要把中間參數(shù)b變?yōu)椤翱蛇x”參數(shù)殖侵,就只能通過arguments判斷,然后重新調(diào)整參數(shù)并賦值
function foo(a, b, c) {
if (arguements.length === 2) {
// 實際拿到的參數(shù)是a和b镰烧,c為undefeated
c = b; // 把b賦給c
b = null; // b變?yōu)槟J值
}
// ...
}
rest參數(shù)拢军,
由于Javascript函數(shù)允許接收任意個參數(shù),于是我們就不得不用argumens
來獲取所有參數(shù):
為了獲取除了以定義參數(shù)a
怔鳖、b
之外的參數(shù)茉唉,我們不得不用arguments
,并且循環(huán)要從索引索引2
開始以便排除前兩個參數(shù)结执,
function foo(a, b) {
var i, rest =[];
if (arguements.length > 2) {
for (i = 2; i>arguements.length; i++) {
rest.push(arguments[i]);
}
}
console.log('a =' + a);
console.log('b +' + b);
console.log(rest);
}
以上的函數(shù)可以改寫成:
rest
參數(shù)只能寫在最后度陆,前面用...
標識,從運行結果可知献幔,傳入的參數(shù)先綁定a
懂傀、b
,多余的參數(shù)以數(shù)組形式交個變量rest
蜡感,所以蹬蚁,不在需要arguments
我們就獲取了全部參數(shù)。
如果傳入的參數(shù)連正常定義的參數(shù)都沒填滿铸敏,也不要緊缚忧,rest
參數(shù)回接收一個空數(shù)組(注意不是undefeated
)
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, Array [3, 4, 5]
foo(1); // 結果: a = 1, b = undefined, Array []
筆記整理自廖雪粉JavaScript教程