1.1函數(shù)
在js里面颊乘,可能會(huì)定義非常多的相同代碼或者功能類似的代碼参淹,這些代碼可能需要大量重復(fù)使用。雖然for循環(huán)語(yǔ)句也能實(shí)現(xiàn)一些簡(jiǎn)單的重復(fù)操作疲牵,但是比較具有局限性承二,此時(shí)我們就可以使用js中的函數(shù)榆鼠。
// 1. 求 1~100的累加和
var sum = 0;
for (var i = 1; i <= 100; i++) {
sum += i;
}
console.log(sum);
// 2. 求 10~50的累加和
var sum = 0;
for (var i = 10; i <= 50; i++) {
sum += i;
}
console.log(sum);
// 3. 函數(shù)就是封裝了一段可以被重復(fù)執(zhí)行調(diào)用的代碼塊 目的: 就是讓大量代碼重復(fù)使用
function getSum(num1, num2) {
var sum = 0;
for (var i = num1; i <= num2; i++) {
sum += i;
}
console.log(sum);
}
getSum(1, 100);
getSum(10, 50);
getSum(1, 1000);
1.2函數(shù)的使用
函數(shù)在使用時(shí)分為兩步:聲明函數(shù)和調(diào)用函數(shù)
- 聲明函數(shù)本身并不會(huì)執(zhí)行代碼纲爸,只有調(diào)用函數(shù)時(shí)才會(huì)執(zhí)行函數(shù)體代碼。
1.2.1聲明函數(shù)
// 函數(shù)使用分為兩步: 聲明函數(shù) 和 調(diào)用函數(shù)
// 1. 聲明函數(shù)
// function 函數(shù)名() {
// // 函數(shù)體
// }
function sayHi() {
console.log('hi~~');
}
// (1) function 聲明函數(shù)的關(guān)鍵字 全部小寫
// (2) 函數(shù)是做某件事情妆够,函數(shù)名一般是動(dòng)詞 sayHi
// (3) 函數(shù)不調(diào)用自己不執(zhí)行
1.2.2調(diào)用函數(shù)
// 函數(shù)名();
sayHi();
// 調(diào)用函數(shù)的時(shí)候千萬(wàn)不要忘記加小括號(hào)
1.3函數(shù)的封裝
- 函數(shù)的封裝就是把一個(gè)或者多個(gè)功能通過(guò)函數(shù)的方式封裝起來(lái)识啦,對(duì)外只提供一個(gè)簡(jiǎn)單的函數(shù)接口。
// 利用函數(shù)計(jì)算1-100之間的累加和
// 1. 聲明函數(shù)
function getSum() {
var sum = 0;
for (var i = 1; i <= 100; i++) {
sum += i;
}
console.log(sum);
}
// 2. 調(diào)用函數(shù)
getSum();
getSum();
1.4函數(shù)的參數(shù)
形參和實(shí)參
形參:在聲明函數(shù)的小括號(hào)里
實(shí)參:在調(diào)用函數(shù)的小括號(hào)里
// 2. 我們可以利用函數(shù)的參數(shù)實(shí)現(xiàn)函數(shù)重復(fù)不同的代碼
// function 函數(shù)名(形參1,形參2...) { // 在聲明函數(shù)的小括號(hào)里面是 形參 (形式上的參數(shù))
// }
// 函數(shù)名(實(shí)參1,實(shí)參2...); // 在函數(shù)調(diào)用的小括號(hào)里面是實(shí)參(實(shí)際的參數(shù))
// 3. 形參和實(shí)參的執(zhí)行過(guò)程(函數(shù)如果沒(méi)有調(diào)用則不執(zhí)行神妹,于是先是 cook('酸辣土豆絲');隨后往上找cook這個(gè)函數(shù)颓哮,然后將酸辣土豆絲賦值給aru。
function cook(aru) { // 形參是接收實(shí)參的 aru = '酸辣土豆絲' 形參類似于一個(gè)變量
console.log(aru);
}
cook('酸辣土豆絲');
cook('大肘子');
// 4. 函數(shù)的參數(shù)可以有鸵荠,也可以沒(méi)有個(gè)數(shù)不限
利用函數(shù)求任意兩個(gè)數(shù)的和
// 1. 利用函數(shù)求任意兩個(gè)數(shù)的和
function getSum(num1, num2) {
console.log(num1 + num2);
}
getSum(1, 3);
getSum(3, 8);
// 2. 利用函數(shù)求任意兩個(gè)數(shù)之間的和
function getSums(start, end) {
var sum = 0;
for (var i = start; i <= end; i++) {
sum += i;
}
console.log(sum);
}
getSums(1, 100);
getSums(1, 10);
// 3. 注意點(diǎn)
// (1) 多個(gè)參數(shù)之間用逗號(hào)隔開(kāi)
// (2) 形參可以看做是不用聲明的變量
1.5函數(shù)形參和實(shí)參個(gè)數(shù)不匹配問(wèn)題
參數(shù)個(gè)數(shù) | 說(shuō)明 |
---|---|
實(shí)參等于形參個(gè)數(shù) | 輸出正確結(jié)果 |
實(shí)參多于形參個(gè)數(shù) | 只取到形參個(gè)數(shù) |
實(shí)參小于形參個(gè)數(shù) | 多的形參定義為undefined,結(jié)果為NaN |
// 函數(shù)形參實(shí)參個(gè)數(shù)匹配
function getSum(num1, num2) {
console.log(num1 + num2);
}
// 1. 如果實(shí)參的個(gè)數(shù)和形參的個(gè)數(shù)一致 則正常輸出結(jié)果
getSum(1, 2);
// 2. 如果實(shí)參的個(gè)數(shù)多于形參的個(gè)數(shù) 會(huì)取到形參的個(gè)數(shù)
getSum(1, 2, 3);
// 3. 如果實(shí)參的個(gè)數(shù)小于形參的個(gè)數(shù) 多于的形參定義為undefined 最終的結(jié)果就是 NaN
// 形參可以看做是不用聲明的變量 num2 是一個(gè)變量但是沒(méi)有接受值 結(jié)果就是undefined
getSum(1); // NaN
// 建議 我們盡量讓實(shí)參的個(gè)數(shù)和形參相匹配
1.6函數(shù)的返回值
1.6.1return語(yǔ)句
有的時(shí)候我們會(huì)希望函數(shù)將值返回給調(diào)用者冕茅,此時(shí)通過(guò)使用renturn語(yǔ)句就可以實(shí)現(xiàn)
function 函數(shù)名() {
return 需要返回的結(jié)果;
}
函數(shù)名();
(1) 我們函數(shù)只是實(shí)現(xiàn)某種功能,最終的結(jié)果需要返回給函數(shù)的調(diào)用者函數(shù)名() 通過(guò)return 實(shí)現(xiàn)的
(2) 只要函數(shù)遇到return 就把后面的結(jié)果 返回給函數(shù)的調(diào)用者 函數(shù)名() = return后面的結(jié)果
function getResult() {
return 666;
}
getResult(); // getResult() = 666
console.log(getResult());
// function cook(aru) {
// return aru;
// }
// console.log(cook('大肘子'));
// 4. 求任意兩個(gè)數(shù)的和
function getSum(num1, num2) {
return num1 + num2;
}
console.log(getSum(1, 2));
求兩個(gè)數(shù)的最大值
// 利用函數(shù) 求兩個(gè)數(shù)的最大值
function getMax(num1, num2) {
// if (num1 > num2) {
// return num1;
// } else {
// return num2;
// }
return num1 > num2 ? num1 : num2;
}
console.log(getMax(1, 3));
console.log(getMax(11, 3));
求數(shù)組中的最大值
// 利用函數(shù)求數(shù)組 [5,2,99,101,67,77] 中的最大數(shù)值。
function getArrMax(arr) { // arr 接受一個(gè)數(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í)參是一個(gè)數(shù)組送過(guò)去
// 在我們實(shí)際開(kāi)發(fā)里面姨伤,我們經(jīng)常用一個(gè)變量來(lái)接受 函數(shù)的返回結(jié)果 使用更簡(jiǎn)單
// var re = getArrMax([5, 2, 99, 101, 67, 77]);
var re = getArrMax([3, 77, 44, 99, 143]);
console.log(re);
注意事項(xiàng)
- return 終止函數(shù)
function getSum(num1, num2) {
return num1 + num2; // return 后面的代碼不會(huì)被執(zhí)行
alert('我是不會(huì)被執(zhí)行的哦哨坪!')
}
console.log(getSum(1, 2));
- return 只能返回一個(gè)值
function fn(num1, num2) {
return num1, num2; // 返回的結(jié)果是最后一個(gè)值
}
console.log(fn(1, 2));
- 我們求任意兩個(gè)數(shù)的 加減乘數(shù)結(jié)果
function getResult(num1, num2) {
return [num1 + num2, num1 - num2, num1 * num2, num1 / num2];
}
var re = getResult(1, 2); // 返回的是一個(gè)數(shù)組
console.log(re);
- 我們的函數(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語(yǔ)句中的值忿偷,同時(shí)還可以結(jié)束當(dāng)前的函數(shù)體內(nèi)代碼
1.7arguments的使用
當(dāng)我們不確定有多少個(gè)參數(shù)傳遞時(shí),可以用arguments來(lái)獲取臊泌。在js中鲤桥,arguments實(shí)際上它時(shí)當(dāng)前函數(shù)的一個(gè)內(nèi)置對(duì)象。所有函數(shù)都內(nèi)置了一個(gè)arguments對(duì)象渠概,arguments對(duì)象中存儲(chǔ)了傳遞的所有實(shí)參芜壁。
function fn() {
console.log(arguments); //里面存儲(chǔ)了所有傳遞過(guò)來(lái)的實(shí)參 1 2 3
console.log(arguments.length);// 3
console.log(arguments[2]);//3
// 我們可以按照數(shù)組的方式遍歷arguments
for (var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
fn(1,2,3);
arguments展示形式時(shí)一個(gè)偽數(shù)組,因此可以進(jìn)行遍歷高氮。偽數(shù)組具有以下特點(diǎn):
- 具有l(wèi)ength屬性
console.log(arguments.length); - 按索引方式存儲(chǔ)數(shù)據(jù)
- 不具有數(shù)組的push慧妄,pop等方法
利用函數(shù)求任意個(gè)數(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ù)冒泡排序
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));
1.8函數(shù)可以調(diào)用另一個(gè)函數(shù)
因?yàn)槊總€(gè)函數(shù)都是獨(dú)立的代碼塊,用于完成特殊任務(wù)剪芍,因此經(jīng)常會(huì)用到函數(shù)相互調(diào)用的情況塞淹。
// 函數(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();
輸出年份的2月份天數(shù)
// 用戶輸入年份,輸出當(dāng)前年份2月份的天數(shù)
function backDay() {
var year = prompt('請(qǐng)您輸入年份:');
if (isRunYear(year)) { // 調(diào)用函數(shù)需要加小括號(hào)
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;d
}
1.9函數(shù)的兩種聲明方式
// 1. 利用函數(shù)關(guān)鍵字自定義函數(shù)(命名函數(shù))
function fn() {
}
fn();
// 2. 函數(shù)表達(dá)式(匿名函數(shù))
// var 變量名 = function() {};
var fun = function(aru) {
console.log('我是函數(shù)表達(dá)式');
console.log(aru);
}
fun('pink老師');
// (1) fun是變量名 不是函數(shù)名
// (2) 函數(shù)表達(dá)式聲明方式跟聲明變量差不多罪裹,只不過(guò)變量里面存的是值 而 函數(shù)表達(dá)式里面存的是函數(shù)
// (3) 函數(shù)表達(dá)式也可以進(jìn)行傳遞參數(shù)