函數(shù)具有封裝以及復(fù)用的特點(diǎn)
function,是被設(shè)計(jì)為執(zhí)行特定任務(wù)的代碼塊
函數(shù)可以把具有相同或相似邏輯的代碼“包裹”起來(lái),通過(guò)函數(shù)調(diào)用執(zhí)行這些被“包裹”的代碼邏輯,這么做的優(yōu)勢(shì)是有利于精簡(jiǎn)代碼方便復(fù)用宋雏。
函數(shù)聲明的語(yǔ)法:
function 函數(shù)名 () {
函數(shù)體代碼塊
(函數(shù)的功能代碼都要寫在函數(shù)體當(dāng)中。)
}
注意:函數(shù)聲明后會(huì)被自動(dòng)放到script標(biāo)簽的最上方
函數(shù)名的命名規(guī)則:
函數(shù)名命名規(guī)范
和變量命名基本一致
盡量小駝峰式命名法
前綴應(yīng)該為動(dòng)詞
命名建議:常用動(dòng)詞約定
命名了函數(shù)怎么去調(diào)用呢务豺?
函數(shù)名()磨总;即可調(diào)用函數(shù)
命名了函數(shù)不調(diào)用函數(shù)是看不到效果的,必須要調(diào)用函數(shù)才能看到函數(shù)的運(yùn)行結(jié)果笼沥。
函數(shù)傳參
若函數(shù)完成功能需要調(diào)用者傳入數(shù)據(jù)蚪燕,那么就需要用有參數(shù)的函數(shù)
這樣可以極大提高函數(shù)的靈活性
參數(shù)寫在()內(nèi),多個(gè)參數(shù)間要用英文逗號(hào)隔開
形參: 聲明函數(shù)的時(shí)候奔浅,在小括號(hào)內(nèi)部定義的變量馆纳,實(shí)際執(zhí)行效果,相當(dāng)于聲明了變量但變量沒(méi)賦值
實(shí)參: 函數(shù)執(zhí)行的時(shí)候汹桦,在小括號(hào)內(nèi)部傳遞的數(shù)據(jù)鲁驶,相當(dāng)于執(zhí)行了賦值操作
怎么樣讓函數(shù)傳參呢?
let sum = 0;
function getSum(a, b) {//此處的a舞骆、b分別為參數(shù)一钥弯,參數(shù)二
// 開始數(shù)設(shè)置為a,循環(huán)次數(shù)設(shè)置為b
for (let i = a; i <= b; i++) {
sum += i;
}
document.write(sum)
}
getSum(6, 300)//此處把a(bǔ)=6督禽,b=300傳入函數(shù)中了
邏輯中斷淘这,取默認(rèn)值的技巧
function getSum(x, y) {
// 邏輯中斷: 邏輯或的技巧---取默認(rèn)值
// 1. 當(dāng) y 沒(méi)傳實(shí)參時(shí)需频, 默認(rèn)值為 undefined
// 2. undefined || 0 ; 前為邏輯假岂膳,返回后面的值 0
// 3. 相當(dāng)于 y = 0 ; 設(shè)置了默認(rèn)值
x = x || 0;
y = y || 0;
document.write(x + y);
}
getSum(1);
案例:求學(xué)生總分
let scores = [231, 4, 235, 3, 6, 456, 5, 7];
let scores2 = [1, 44, 235, 32, 6, 124, 512, 7];
let scores3 = [155, 44, 28, 32, 62, 2, 512, 57];
function getTotalScore(studentList) {
let total = 0;
for (let i = 0; i < studentList.length; i++) {
total += studentList[i];
}
document.write(total);
document.write("</br>");
}
getTotalScore(scores);
getTotalScore(scores2);
getTotalScore(scores3);
函數(shù)返回值
有返回值函數(shù)的概念:
當(dāng)調(diào)用某個(gè)函數(shù)砰蠢,這個(gè)函數(shù)會(huì)返回一個(gè)結(jié)果出來(lái),這就是有返回值的函數(shù)
用return返回?cái)?shù)據(jù)
當(dāng)函數(shù)需要返回?cái)?shù)據(jù)出去時(shí),用return關(guān)鍵字
語(yǔ)法:return 數(shù)據(jù)玖院;
細(xì)節(jié)注意點(diǎn):
1.在函數(shù)體中使用 return 關(guān)鍵字能將內(nèi)部的執(zhí)行結(jié)果交給函數(shù)外部使用
2.函數(shù)內(nèi)部只能運(yùn)行到 1 次 return菠红,并且 return 后面代碼不會(huì)再被執(zhí)行,所以 return 后面的數(shù)據(jù)不要換行寫
3.return會(huì)立即結(jié)束當(dāng)前函數(shù)
4.函數(shù)可以沒(méi)有 return难菌,這種情況函數(shù)默認(rèn)返回值為 undefined
return案例:
// 任意兩個(gè)數(shù)比較最大值
// 因?yàn)槭侨我鈨蓚€(gè)數(shù)试溯,有動(dòng)態(tài)值,應(yīng)該聲明兩個(gè)形參(可變的)
function getMax(x, y) {
// 用if判斷x郊酒,y的值
if (x > y) {
// 如果x大于y則返回x的值
return x;
} else {
// 否則返回y的值
return y;
}
}
console.log(getMax(5, 10));//10
console.log(getMax(20, 11));//20
console.log(getMax(12, 38));//38
作用域
通常來(lái)說(shuō)遇绞,一段程序代碼中所用到的名字并不總是有效和可用的,而限定這個(gè)名字的可用性的代碼范圍就是這個(gè)名字的作用域燎窘。作用域的使用提高了程序邏輯的局部性摹闽,增強(qiáng)了程序的可靠性,減少了名字沖突褐健。
作用域有三種
全局作用域:作用于所有代碼執(zhí)行的環(huán)境(整個(gè) script 標(biāo)簽內(nèi)部)或者多個(gè) js 文件
局部作用域:作用于函數(shù)內(nèi)的代碼環(huán)境付鹿,就是局部作用域。 因?yàn)楦瘮?shù)有關(guān)系蚜迅,所以也稱為函數(shù)作用域舵匾。
塊級(jí)作用域:塊作用域由 { } 包括,if語(yǔ)句和for語(yǔ)句里面的{ }等
根據(jù)作用域的不同,變量也分為全局變量谁不、局部變量坐梯、塊級(jí)變量
全局變量:全局變量在變量定義之后區(qū)域可以訪問(wèn)和修改
局部變量:局部變量只能在當(dāng)前函數(shù)內(nèi)部訪問(wèn)和修改
塊級(jí)變量:let定義的變量,只能在塊作用域里訪問(wèn),不能跨塊訪問(wèn),也不能跨函數(shù)訪問(wèn)
變量作用域特殊情況:
- 如果函數(shù)內(nèi)部或者塊級(jí)作用域內(nèi)部,變量沒(méi)有聲明刹帕,直接賦值吵血,也當(dāng)全局變量看,但是強(qiáng)烈不推薦
- 函數(shù)內(nèi)部的形參可以看做是局部變量轩拨,所以形參相當(dāng)于函數(shù)內(nèi)部定義的局部變量践瓷,只有在函數(shù)內(nèi)部可以使用。
變量訪問(wèn)原則-作用域鏈
只要是代碼亡蓉,就至少有一個(gè)作用域
寫在函數(shù)內(nèi)部的局部作用域
如果函數(shù)中還有函數(shù),那么在這個(gè)作用域中就又可以誕生一個(gè)作用域
根據(jù)在內(nèi)部函數(shù)可以訪問(wèn)外部函數(shù)變量的這種機(jī)制喷舀,用鏈?zhǔn)讲檎覜Q定哪些數(shù)據(jù)能被內(nèi)部函數(shù)訪問(wèn)砍濒,就稱作作用域鏈
作用域鏈遵循就近原則來(lái)查找變量最終的值
匿名函數(shù):
將匿名函數(shù)賦值給一個(gè)變量,并且通過(guò)變量名稱進(jìn)行調(diào)用 我們將這個(gè)稱為函數(shù)表達(dá)式
語(yǔ)法:
let fn = function () {
//函數(shù)體
};
調(diào)用:
fn();
使用場(chǎng)景:Web API階段會(huì)用
立即執(zhí)行函數(shù)
作用:防止全局變量污染
語(yǔ)法:
(function () {console.log(11)} ) ();
(function () {console.log(22)} () );
注意: 多個(gè)立即執(zhí)行函數(shù)要用 ; 隔開硫麻,要不然會(huì)報(bào)錯(cuò)
轉(zhuǎn)換時(shí)間案例:
// 小時(shí): h = parseInt(總秒數(shù) / 60 / 60 % 24)
// 分鐘: m = parseInt(總秒數(shù) / 60 % 60 )
// 秒數(shù): s = parseInt(總秒數(shù) % 60)
// 步驟一:用戶輸入總秒數(shù)
let total = prompt("請(qǐng)輸出總秒數(shù)")
// 步驟二:計(jì)算時(shí)分秒
let h = parseInt(total / 60 / 60 % 24),
m = parseInt(total / 60 % 60),
s = parseInt(total % 60);
// 步驟三:函數(shù)封裝并輸出格式化
function normalize(num) {
// 三元表達(dá)式(雙分支)
return num < 10 ? `0${num}` : num;
};
// 步驟四:函數(shù)調(diào)用以及復(fù)用
h = normalize(h);
m = normalize(m);
s = normalize(s);
// 步驟五:頁(yè)面輸出
document.write(`${total}秒轉(zhuǎn)換為${h}時(shí)${m}分${s}秒`);