函數就是包裹在花括號中的代碼塊,前面使用了關鍵詞 function。
一、定義函數
function myFunction(x){
if(x>=0){
return x;
} else {
return -x;
}
}
上述myFunction()函數的定義如下:
1.function關鍵字指明這是一個函數;
2.myFunction是函數名;
3.x是參數;
4.花括號裏面的代碼是函數體,可以包括若干語句,甚至可以沒有語句。
注意:
函數體的代碼在執行的時候,一旦遇到return時就會執行完畢立即返回,其後的語句並不會執行。如果沒有return語句,就會返回undefined。
由於javascript的函數也是一個對象,上述的函數也可這樣定義
var myFunction = function(x){
if(x>=0){
return x;
} else {
return -x;
}
};
該函數沒有函數名,所以屬於一個匿名函數;但是該函數賦值給了變量myFunction,因此可以通過myFunction調用。
注意第二種方式按照完整語法需要在函數體末尾加一個;
,表示賦值語句結束。
二、調用函數
myFunction(9);//返回9
由於javascript允許傳入任意個參數而不影響調用,因此可以傳入多個(更少)的參數都沒問題。
myFunction(9,'balalal');//返回9
myFunction();//返回NaN
三、arguments
javascript還有一個免費贈送的關鍵字arguments,它只在函數的內部起作用,並且永遠指向函數的調用者所傳入的參數。arguments類似array,但是不是array。
使用場景1
function foo(x){
console.log(x)//10
for(var i=0;i<arguments.length;i++){
console.log(arguments[i]);//10 20 30
}
}
foo(10,20,30)
使用場景2
即使函數不定義任何參數,還是可以拿到參數的值:
function abs() {
if (arguments.length === 0) {
return 0;
}
var x = arguments[0];
return x >= 0 ? x : -x;
}
abs(); // 0
abs(10); // 10
abs(-9); // 9
使用場景3
// foo(a[, b], c)
// 接收2~3個參數,b是可選參數,如果只傳2個參數,b默認爲null:
function(a,b,c){
if(arguments.length===2){
c = b
b = null
}
}
使用場景4
實現一個函數,該函數期望接受無限多個參數,整個函數返回所有參數相加之和,該函數有智能檢測功能,如碰到任意一個參數爲非Number類型時,返回'請輸入number類型'。
function add(){
var sum = 0
for(var i=0;i<arguments.length;i++){
if(typeofarguments[i] === 'Number'){
sum += arguments[i]
} else {
return '請輸入number類型';
}
}
return sum;
}
console.log(add(1,2,3,5,6,10));
四、rest
ES6引入了rest參數
function foo(a,b,...rest){
console.log('a = ' + a);
console.log('b = ' + b);
console.log(rest);
}
console.log(foo(1,2,3,4,5))
// 1
// 2
// [3,4,5]
foo(1);
// 結果:
// a = 1
// b = undefined
// Array []
注意:rest參數必須寫在最後一個位置,前面用...
標識,從運行結果可知,傳入的參數先綁定a
、b
,多餘的參數以數組形式交給變量rest,rest是一個數組,如果沒有給它傳值,則是一個空數組。
使用練習
//使用rest計算參數和
function foo(...rest){
var sum = 0;
for(var i=0;i<rest.length;i++){
sum += rest[i]
}
return sum;
}