JavaScript 基礎 - 第4天筆記
理解封裝的意義,能夠通過函數的聲明實現邏輯的封裝,知道對象數據類型的特征,結合數學對象實現簡單計算功能。
理解函數的封裝的特征
掌握函數聲明的語法
理解什么是函數的返回值
知道并能使用常見的內置函數
函數
理解函數的封裝特性,掌握函數的語法規則
聲明和調用
函數可以把具有相同或相似邏輯的代碼“包裹”起來,通過函數調用執行這些被“包裹”的代碼邏輯,這么做的優勢是有利于精簡代碼方便復用。
聲明(定義)
聲明(定義)一個完整函數包括關鍵字、函數名、形式參數、函數體、返回值5個部分
調用
聲明(定義)的函數必須調用才會真正被執行,使用 ()
調用函數。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JavaScript 基礎 - 聲明和調用</title>
</head>
<body><script>// 聲明(定義)了最簡單的函數,既沒有形式參數,也沒有返回值function sayHi() {console.log('嗨~')}// 函數調用,這些函數體內的代碼邏輯會被執行// 函數名()sayHi()// 可以重復被調用,多少次都可以sayHi()</script>
</body>
</html>
注:函數名的命名規則與變量是一致的,并且盡量保證函數名的語義。
小案例: 小星星
<script>// 函數聲明function sayHi() {// document.write('hai~')document.write(`*<br>`)document.write(`**<br>`)document.write(`***<br>`)document.write(`****<br>`)document.write(`*****<br>`)document.write(`******<br>`)document.write(`*******<br>`)document.write(`********<br>`)document.write(`*********<br>`)}// 函數調用sayHi()sayHi()sayHi()sayHi()sayHi()</script>
參數
通過向函數傳遞參數,可以讓函數更加靈活多變,參數可以理解成是一個變量。
聲明(定義)一個功能為打招呼的函數
傳入數據列表
聲明這個函數需要傳入幾個數據
多個數據用逗號隔開
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JavaScript 基礎 - 函數參數</title>
</head>
<body>
?<script>// 聲明(定義)一個功能為打招呼的函數// function sayHi() {// ? console.log('嗨~')// }// 調用函數// sayHi()?// 這個函數似乎沒有什么價值,除非能夠向不同的人打招呼// 這就需要借助參數來實現了function sayHi(name) {// 參數 name 可以被理解成是一個變量console.log(name)console.log('嗨~' + name)}
?// 調用 sayHi 函數,括號中多了 '小明'// 這時相當于為參數 name 賦值了sayHi('小明')// 結果為 小明
?// 再次調用 sayHi 函數,括號中多了 '小紅'// 這時相當于為參數 name 賦值了sayHi('小紅') // 結果為 小紅</script>
</body>
</html>
總結:
聲明(定義)函數時的形參沒有數量限制,當有多個形參時使用
,
分隔調用函數傳遞的實參要與形參的順序一致
形參和實參
形參:聲明函數時寫在函數名右邊小括號里的叫形參(形式上的參數)
實參:調用函數時寫在函數名右邊小括號里的叫實參(實際上的參數)
形參可以理解為是在這個函數內聲明的變量(比如 num1 = 10)實參可以理解為是給這個變量賦值
開發中盡量保持形參和實參個數一致
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JavaScript 基礎 - 函數參數</title>
</head>
<body><script>// 聲明(定義)一個計算任意兩數字和的函數// 形參 x 和 y 分別表示任意兩個數字,它們是兩個變量function count(x, y) {console.log(x + y);}// 調用函數,傳入兩個具體的數字做為實參// 此時 10 賦值給了形參 x// 此時 5 賦值給了形參 ycount(10, 5); // 結果為 15</script>
</body>
</html>
返回值
函數的本質是封裝(包裹),函數體內的邏輯執行完畢后,函數外部如何獲得函數內部的執行結果呢?要想獲得函數內部邏輯的執行結果,需要通過 return
這個關鍵字,將內部執行結果傳遞到函數外部,這個被傳遞到外部的結果就是返回值。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JavaScript 基礎 - 函數返回值</title>
</head>
<body>
?<script>// 定義求和函數function count(a, b) {let s = a + b// s 即為 a + b 的結果// 通過 return 將 s 傳遞到外部return s}
?// 調用函數,如果一個函數有返回值// 那么可將這個返回值賦值給外部的任意變量let total = count(5, 12)</script>
</body>
</html>
總結:
在函數體中使用return 關鍵字能將內部的執行結果交給函數外部使用
函數內部只能出現1 次 return,并且 return 下一行代碼不會再被執行,所以return 后面的數據不要換行寫
return會立即結束當前函數
函數可以沒有return,這種情況默認返回值為 undefined
作用域
通常來說,一段程序代碼中所用到的名字并不總是有效和可用的,而限定這個名字的可用性的代碼范圍就是這個名字的作用域。
作用域的使用提高了程序邏輯的局部性,增強了程序的可靠性,減少了名字沖突。
全局作用域
作用于所有代碼執行的環境(整個 script 標簽內部)或者一個獨立的 js 文件
處于全局作用域內的變量,稱為全局變量
局部作用域
作用于函數內的代碼環境,就是局部作用域。 因為跟函數有關系,所以也稱為函數作用域。
處于局部作用域內的變量稱為局部變量
如果函數內部,變量沒有聲明,直接賦值,也當全局變量看,但是強烈不推薦
但是有一種情況,函數內部的形參可以看做是局部變量。
函數進行查找作用域
依次從里函數向外函數查找變量,換句話來說先看看自己有沒有這個變量,如果有就拿自己的,如果沒有就那外一個函數的,如果還沒有就用全局的,如果依然沒有就undefined
? ?<script>let num = 10function fun1() {let num = 20function fun2() {let num = 30function fun3() {// 自己沒有就用fun2的,如果fun2也沒有就用fun1的,如果fun1也沒有就使用全局變量,如果全局變量也沒有,就undefinedconsole.log(num)}fun3()}fun2()
?}fun1()</script>
匿名函數
函數可以分為具名函數和匿名函數
匿名函數:沒有名字的函數,無法直接使用。
函數表達式
// 聲明
let fn = function() { console.log('函數表達式')
}
// 調用
fn()
立即執行函數
(function(){ xxx })();
(function(){xxxx}());
無需調用,立即執行,其實本質已經調用了
多個立即執行函數之間用分號隔開
?在能夠訪問到的情況下 先局部 局部沒有在找全局