函數(shù)對任何語言來說都應(yīng)該是核心的概念。函數(shù)的主要作用是封裝任意多條語句了,然后在我們需要的時(shí)候調(diào)用執(zhí)行流济。
聲明函數(shù)
使用function來聲明函數(shù)锐锣,后面跟隨一組參數(shù)。語法如下:
function fun(argments1,argments2){
statement;
}
下面是一個(gè)示例:
function hi(name,message){
console.log("hello,"+name+","+message);
}
hi("咸魚","一條正在學(xué)習(xí)前端的咸魚")//調(diào)用前面定義的函數(shù) 結(jié)果為:"hello,咸魚,一條正在學(xué)習(xí)前端的咸魚"
調(diào)用可以通過函數(shù)名加括號绳瘟,在括號能填上參數(shù)雕憔,有多個(gè)參數(shù)使用,
逗號隔開;
也可以通過函數(shù)表達(dá)式來創(chuàng)建函數(shù)
var printName = function(name,message){
console.log("hello,"+name+","+message);
}
printName("小明",".")
var
一個(gè)變量糖声,然后給這個(gè)變量賦值一個(gè)函數(shù)表達(dá)式;
函數(shù)有一個(gè)很重要作用就是復(fù)用性斤彼,例如我們有一個(gè)特定的功能需要三句語句來實(shí)現(xiàn),那么每次來實(shí)現(xiàn)這個(gè)功能時(shí)都要復(fù)制這三個(gè)語句就顯得很麻煩姨丈,所以我們可以把這些語句打包成一個(gè)函數(shù)畅卓,再需要實(shí)現(xiàn)這個(gè)功能的時(shí)候直接調(diào)用一下函數(shù)就可以了。
返回值
在很多情況下我們使用函數(shù)其實(shí)是需要函數(shù)的返回值蟋恬,函數(shù)的默認(rèn)返回值是undefined翁潘,但是我們可以通過return
語句加上需要返回的值來實(shí)現(xiàn)返回值,下面是一個(gè)例子:
function sum(num1,num2){
return num1 + num2;
}
var num = sum(1,5);
console.log(sum);//6
上面這個(gè)例子中使用return設(shè)置返回值為num1+num2
然后我們把sum()
調(diào)用并把值賦給了變量num
。
不過我們需要注意一下歼争,但函數(shù)執(zhí)行return
語句后就會(huì)立即停止并退出拜马,后面的語句不會(huì)繼續(xù)執(zhí)行:
function sum(num1,num2){
return num1 + num2;
console.log("num1");
}
console.log("num1")
將不會(huì)被執(zhí)行
參數(shù)
JavaScript函數(shù)的參數(shù)可以傳遞任意數(shù)量的參數(shù),參數(shù)可以是任何數(shù)據(jù)類型沐绒。所以被傳遞的參數(shù)都會(huì)被保存在arguments
中俩莽,arguments
是一個(gè)類數(shù)組對象。
arguments是一個(gè)類數(shù)組對象乔遮,所以會(huì)擁有數(shù)組的方法和特性
因?yàn)楹瘮?shù)其實(shí)是通過arguments來訪問實(shí)參(在調(diào)用時(shí)傳遞給函數(shù)的參數(shù))的扮超,所以形參(聲明函數(shù)時(shí)命名的參數(shù))只是為了讓我們使用參數(shù)更方便而已。
function message(){
console.log("姓名:"+arguments[0]+","+"年齡:"+ arguments[1]);
}
message("咸魚","20歲")//結(jié)果:姓名:咸魚,年齡:20歲
上面這個(gè)例子并沒有在聲明的時(shí)候定義形參蹋肮。但可以通過arguments[0] arguments[1]
來獲得實(shí)際參數(shù)
由于傳遞給函數(shù)的參數(shù)是不限制個(gè)數(shù)和類型的出刷,所以有些時(shí)候我們得先得知傳遞進(jìn)來的參數(shù)個(gè)數(shù)和類型再對應(yīng)情況進(jìn)行特定的操作:
function doAdd(){
if(arguments.lenght == 1){
console.log(arguments[0] + 10);
}else if(arguments.lenght == 2){
console.log(arguments[0] + arguments[1])
}
}
doAdd(10);//10
doAdd(20,50);//70;
function message(){
for(var i = 0;i< arguments.length;i++){
if(typeof(arguments[i]) === "string"){
var name = arguments[i];
}else if(typeof(arguments[i]) === "number"){
var phoneNunber = arguments[i];
}
}
console.log("名字:"+ name);
console.log("電話號碼:" + phoneNunber);
}
message(10086,"咸魚");
沒有重載
重載是很多面向?qū)ο笳Z言實(shí)現(xiàn)多態(tài)的手段之一,在靜態(tài)語言中確定一個(gè)函數(shù)的手段是靠方法簽名——函數(shù)名+參數(shù)列表坯辩,也就是說相同名字的函數(shù)參數(shù)個(gè)數(shù)不同或者順序不同都被認(rèn)為是不同的函數(shù)馁龟,稱為函數(shù)重載
在JavaScript中沒有函數(shù)重載的概念,函數(shù)通過名字確定唯一性漆魔,參數(shù)不同也被認(rèn)為是相同的函數(shù)坷檩,后面的覆蓋前面的,這是不是意味著JavaScript不能通過重載功能實(shí)現(xiàn)一個(gè)函數(shù)改抡,參數(shù)不同功能不同呢矢炼?
在JavaScript中,函數(shù)調(diào)用沒必要把所有參數(shù)都傳入阿纤,只要你函數(shù)體內(nèi)做好處理就行裸删,但前提是傳的參數(shù)永遠(yuǎn)被當(dāng)做前幾個(gè)
function printPeopleInfo(name, age, sex){
if(name){
console.log(name);
}
if(age){
console.log(age);
}
if(sex){
console.log(sex);
}
}
printPeopleInfo('hunger', 3);
printPeopleInfo('hunger', 3, 'male');