2 - 函數(shù)
2.1 函數(shù)的概念
? 在 JS 里面,可能會定義非常多的相同代碼或者功能相似的代碼只壳,這些代碼可能需要大量重復(fù)使用暑塑。雖然 for循環(huán)語句也能實現(xiàn)一些簡單的重復(fù)操作,但是比較具有局限性惕艳,此時我們就可以使用 JS 中的函數(shù)驹愚。
? 函數(shù):就是封裝了一段可被重復(fù)調(diào)用執(zhí)行的代碼塊。通過此代碼塊可以實現(xiàn)大量代碼的重復(fù)使用谁鳍。
2.2 函數(shù)的使用
聲明函數(shù)
// 聲明函數(shù)
function 函數(shù)名() {
//函數(shù)體代碼
}
function 是聲明函數(shù)的關(guān)鍵字,必須小寫
由于函數(shù)一般是為了實現(xiàn)某個功能才定義的劫瞳, 所以通常我們將函數(shù)名命名為動詞,比如 getSum
調(diào)用函數(shù)
// 調(diào)用函數(shù)
函數(shù)名(); // 通過調(diào)用函數(shù)名來執(zhí)行函數(shù)體代碼
調(diào)用的時候千萬不要忘記添加小括號
-
口訣:函數(shù)不調(diào)用涮因,自己不執(zhí)行
注意:聲明函數(shù)本身并不會執(zhí)行代碼伺绽,只有調(diào)用函數(shù)時才會執(zhí)行函數(shù)體代碼。
函數(shù)的封裝
函數(shù)的封裝是把一個或者多個功能通過函數(shù)的方式封裝起來澜掩,對外只提供一個簡單的函數(shù)接口
簡單理解:封裝類似于將電腦配件整合組裝到機(jī)箱中 ( 類似快遞打包)
例子:封裝計算1-100累加和
/*
計算兩個數(shù)字之間累加和的函數(shù)
*/
// 聲明函數(shù)
function getSum(num1, num2){
var sumNum = 0;// 準(zhǔn)備一個變量杖挣,保存數(shù)字和
for (var i = num1; i <= num2; i++) {
sumNum += i;// 把每個數(shù)值 都累加 到變量中
}
alert(sumNum);
}
// 調(diào)用函數(shù)
getSum(1, 100);
getSum(10, 50);
getSum(1, 1000);
2.3 函數(shù)的參數(shù)
函數(shù)參數(shù)語法
形參:函數(shù)定義時設(shè)置接收調(diào)用時傳入
實參:函數(shù)調(diào)用時傳入小括號內(nèi)的真實數(shù)據(jù)
? 參數(shù)的作用 : 在函數(shù)內(nèi)部某些值不能固定程梦,我們可以通過參數(shù)在調(diào)用函數(shù)時傳遞不同的值進(jìn)去橘荠。
函數(shù)參數(shù)的運用:
// 帶參數(shù)的函數(shù)聲明
function 函數(shù)名(形參1, 形參2 , 形參3...) { // 可以定義任意多的參數(shù)郎逃,用逗號分隔
// 函數(shù)體
}
// 帶參數(shù)的函數(shù)調(diào)用
函數(shù)名(實參1, 實參2, 實參3...);
- 調(diào)用的時候?qū)崊⒅凳莻鬟f給形參的
- 形參簡單理解為:不用聲明的變量
- 實參和形參的多個參數(shù)之間用逗號(,)分隔
函數(shù)形參和實參數(shù)量不匹配時
注意:在JavaScript中,形參的默認(rèn)值是undefined朵你。
小結(jié):
- 函數(shù)可以帶參數(shù)也可以不帶參數(shù)
- 聲明函數(shù)的時候揣非,函數(shù)名括號里面的是形參,形參的默認(rèn)值為 undefined
- 調(diào)用函數(shù)的時候忌傻,函數(shù)名括號里面的是實參
- 多個參數(shù)中間用逗號分隔
- 形參的個數(shù)可以和實參個數(shù)不匹配搞监,但是結(jié)果不可預(yù)計,我們盡量要匹配
2.4 函數(shù)的返回值
return 語句
返回值:函數(shù)調(diào)用整體代表的數(shù)據(jù)俘种;函數(shù)執(zhí)行完成后可以通過return語句將指定數(shù)據(jù)返回 绝淡。
// 聲明函數(shù)
function 函數(shù)名(){
...
return 需要返回的值;
}
// 調(diào)用函數(shù)
函數(shù)名(); // 此時調(diào)用函數(shù)就可以得到函數(shù)體內(nèi)return 后面的值
(1) 函數(shù)只是實現(xiàn)某種功能荐类,最終的結(jié)果需要返回給函數(shù)的調(diào)用者函數(shù)名()茁帽,通過return 實現(xiàn)的
(2) 只要函數(shù)遇到return 就把后面的結(jié)果 返回給函數(shù)的調(diào)用者屈嗤, 函數(shù)名() = return后面的結(jié)果
在使用 return 語句時,函數(shù)會停止執(zhí)行铁追,并返回指定的值
如果函數(shù)沒有 return 茫船,返回的值是 undefined
求任意兩個數(shù)的和
function getSum(num1, num2) {
return num1 + num2;
}
console.log(getSum(1, 2));
- 求兩個數(shù)的最大值
function getMax(num1, num2) {
// if (num1 > num2) {
// return num1;
// } else {
// return num2;
// }
return num1 > num2 ? num1 : num2;
}
console.log(getMax(1, 3)); // 3
console.log(getMax(11, 3)); // 11
- 求數(shù)組中的最大數(shù)值扭屁。
// 利用函數(shù)求數(shù)組 [5,2,99,101,67,77] 中的最大數(shù)值涩禀。
function getArrMax(arr) { // arr 接受一個數(shù)組 arr = [5,2,99,101,67,77]
var max = arr[0];
for (var i = 1; i <= arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
// getArrMax([5, 2, 99, 101, 67, 77]); // 實參是一個數(shù)組送過去
// 在我們實際開發(fā)里面艾船,我們經(jīng)常用一個變量來接受 函數(shù)的返回結(jié)果 使用更簡單
// var re = getArrMax([5, 2, 99, 101, 67, 77]);
var re = getArrMax([3, 77, 44, 99, 143]);// 兩種括號寫法都可以
console.log(re);
函數(shù)返回值注意事項
// 1. return 終止函數(shù)
function getSum(num1, num2) {
return num1 + num2; // return 后面的代碼不會被執(zhí)行
alert('我是不會被執(zhí)行的哦!')
}
console.log(getSum(1, 2));
// 2. return 只能返回一個值
function fn(num1, num2) {
return num1, num2; // 返回的結(jié)果是最后一個值
}
console.log(fn(1, 2));
// 3. 我們求任意兩個數(shù)的 加減乘數(shù)結(jié)果
function getResult(num1, num2) {
return [num1 + num2, num1 - num2, num1 * num2, num1 / num2];
}
var re = getResult(1, 2); // 返回的是一個數(shù)組
console.log(re);
// 4. 我們的函數(shù)如果有return 則返回的是 return 后面的值践宴,如果函數(shù)沒有 return 則返回undefined
function fun1() {
return 666;
}
console.log(fun1()); // 返回 666
function fun2() {
}
console.log(fun2()); // 函數(shù)返回的結(jié)果是 undefined
break ,continue ,return 的區(qū)別
- break :結(jié)束當(dāng)前的循環(huán)體(如 for爷怀、while)
- continue :跳出本次循環(huán),繼續(xù)執(zhí)行下次循環(huán)(如 for磺浙、while)
- return :不僅可以退出循環(huán)徒坡,還能夠返回 return 語句中的值,同時還可以結(jié)束當(dāng)前的函數(shù)體內(nèi)的代碼
2.5 arguments的使用
? 當(dāng)不確定有多少個參數(shù)傳遞的時候伦泥,可以用 arguments 來獲取锦溪。JavaScript 中,arguments實際上它是當(dāng)前函數(shù)的一個內(nèi)置對象刻诊。所有函數(shù)都內(nèi)置了一個 arguments 對象,arguments 對象中存儲了傳遞的所有實參复局。arguments展示形式是一個偽數(shù)組粟判,因此可以進(jìn)行遍歷(并不是真正意義上的數(shù)組)。偽數(shù)組具有以下特點:
具有 length 屬性
按索引方式儲存數(shù)據(jù)
-
不具有數(shù)組的 push , pop 等方法
注意:在函數(shù)內(nèi)部使用該對象角钩,用此對象獲取函數(shù)調(diào)用時傳的實參。
2.6 函數(shù)案例
函數(shù)內(nèi)部可以調(diào)用另一個函數(shù)递礼,在同一作用域代碼中脊髓,函數(shù)名即代表封裝的操作,使用函數(shù)名加括號即可以將封裝的操作執(zhí)行供炼。
- 利用函數(shù)求任意個數(shù)的最大值
function getMax() { // arguments = [1,2,3]
var max = arguments[0];
for (var i = 1; i < arguments.length; i++) {
if (arguments[i] > max) {
max = arguments[i];
}
}
return max;
}
console.log(getMax(1, 2, 3));
console.log(getMax(1, 2, 3, 4, 5));
console.log(getMax(11, 2, 34, 444, 5, 100));
- 利用函數(shù)翻轉(zhuǎn)任意數(shù)組 reverse 翻轉(zhuǎn)
function reverse(arr) {
var newArr = [];
for (var i = arr.length - 1; i >= 0; i--) {
newArr[newArr.length] = arr[i];
}
return newArr;
}
var arr1 = reverse([1, 3, 4, 6, 9]);
console.log(arr1);
var arr2 = reverse(['red', 'pink', 'blue']);
console.log(arr2);
- 利用函數(shù)冒泡排序 sort 排序
function sort(arr) {
for (var i = 0; i < arr.length - 1; i++) {
for (var j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
var arr1 = sort([1, 4, 2, 9]);
console.log(arr1);
var arr2 = sort([11, 7, 22, 999]);
console.log(arr2);
- 利用函數(shù)判斷閏年
function isRunYear(year) {
// 如果是閏年我們返回 true 否則 返回 false
var flag = false;
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
flag = true;
}
return flag;
}
console.log(isRunYear(2000));
console.log(isRunYear(1999));
- 函數(shù)是可以相互調(diào)用的
// function fn1() {
// console.log(11);
// fn2(); // 在fn1 函數(shù)里面調(diào)用了 fn2 函數(shù)
// }
// fn1();
// function fn2() {
// console.log(22);
// }
function fn1() {
console.log(111);
fn2();
console.log('fn1');
}
function fn2() {
console.log(222);
console.log('fn2');
}
fn1();
- 用戶輸入年份冀墨,輸出當(dāng)前年份2月份的天數(shù)
function backDay() {
var year = prompt('請您輸入年份:');
if (isRunYear(year)) { // 調(diào)用函數(shù)需要加小括號
alert('當(dāng)前年份是閏年2月份有29天');
} else {
alert('當(dāng)前年份是平年2月份有28天');
}
}
backDay();
// 判斷是否為閏年的函數(shù)
function isRunYear(year) {
// 如果是閏年我們返回 true 否則 返回 false
var flag = false;
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
flag = true;
}
return flag;
}
2.7 函數(shù)的兩種聲明方式
-
自定義函數(shù)方式(命名函數(shù))
利用函數(shù)關(guān)鍵字 function 自定義函數(shù)方式
// 聲明定義方式 function fn() {...} // 調(diào)用 fn();
- 因為有名字涛贯,所以也被稱為命名函數(shù)
- 調(diào)用函數(shù)的代碼既可以放到聲明函數(shù)的前面,也可以放在聲明函數(shù)的后面
-
函數(shù)表達(dá)式方式(匿名函數(shù))
利用函數(shù)表達(dá)式方式的寫法如下:
// 這是函數(shù)表達(dá)式寫法虫腋,匿名函數(shù)后面跟分號結(jié)束 var fn = function(){...}稀余; // 調(diào)用的方式,函數(shù)調(diào)用必須寫到函數(shù)體下面 fn();
(1) fn是變量名 不是函數(shù)名
(2) 函數(shù)表達(dá)式聲明方式跟聲明變量差不多盒蟆,只不過變量里面存的是值 而 函數(shù)表達(dá)式里面存的是函數(shù)
(3) 函數(shù)表達(dá)式也可以進(jìn)行傳遞參數(shù)
- 因為函數(shù)沒有名字师骗,所以也被稱為匿名函數(shù)
- 這個fn 里面存儲的是一個函數(shù)
- 函數(shù)表達(dá)式方式原理跟聲明變量方式是一致的
- 函數(shù)調(diào)用的代碼必須寫到函數(shù)體后面