導(dǎo)讀
- 函數(shù)是什么
- == 1. 定義函數(shù)==
- 函數(shù)聲明
- 函數(shù)表達(dá)式
- 箭頭函數(shù)
- ==2.調(diào)用函數(shù)==
- 函數(shù)調(diào)用
- 方法調(diào)用
- 構(gòu)造函數(shù)調(diào)用
- 間接調(diào)用
- 隱式函數(shù)調(diào)用
- ==3.函數(shù)參數(shù)==
- 形參默認(rèn)值
- 剩余形參
- arguments對象
- 函數(shù)調(diào)用中的擴(kuò)展符
- 實(shí)參解構(gòu)
函數(shù)是什么
- 函數(shù)是一個代碼塊灸异。(代碼塊就是使用大括號包裹起來的語句的集合)
- 函數(shù)是可重復(fù)執(zhí)行特定任務(wù)的代碼塊架馋。
特點(diǎn)1:函數(shù)只定義一次,可被調(diào)用任意次。
特點(diǎn)2:定義的函數(shù)永遠(yuǎn)不會執(zhí)行刻像,除非你調(diào)用它板甘。
示例:函數(shù)
function sum(a,b){
let c = a + b
return c
}
======1. 定義函數(shù) ======
函數(shù)聲明
函數(shù)聲明是使用function關(guān)鍵字定義的函數(shù)聲明語句忽妒。它是命名的代碼塊熄赡。
函數(shù)聲明是定義函數(shù)的傳統(tǒng)方式。它的語法格式如下:
function 函數(shù)名稱(形參1,形參2,...,形參N){
//函數(shù)體
return 值
}
- function:關(guān)鍵字齿税,用于聲明函數(shù)彼硫。
- 函數(shù)名稱:就是賦予代碼塊一個名字。函數(shù)聲明會創(chuàng)建一個變量凌箕,函數(shù)名稱就是變量的名稱拧篮,這是理解函數(shù)的關(guān)鍵。函數(shù)名稱用于存放代碼塊牵舱。代碼塊相當(dāng)于變量的值串绩。
-
形參:形參是函數(shù)的形式上的參數(shù),用于接收函數(shù)調(diào)用時傳入的實(shí)際參數(shù)芜壁。就是變量礁凡,只是省略了聲明變量的關(guān)鍵詞
var
。它是小括號里用逗號分隔的參數(shù)慧妄。一個函數(shù)通常具有0個或多個形參顷牌。形參用于接收在函數(shù)調(diào)用時通過形參傳入函數(shù)內(nèi)的實(shí)參。 - 函數(shù)體 :使用大括號包裹的代碼塊塞淹。函數(shù)體相當(dāng)于函數(shù)名的值窟蓝。
-
return語句:如果你希望函數(shù)運(yùn)行之后計(jì)算出一個值,那么你需要在函數(shù)內(nèi)使用
return
語句顯式設(shè)置返回值饱普。return語句不是必須設(shè)置的运挫,如果沒有在函數(shù)體內(nèi)設(shè)置return
語句,那么函數(shù)默認(rèn)的返回值是undefiend
套耕。注意:一個函數(shù)只能有一個返回值谁帕,如果你需要返回多個值,可以考慮將多個值放入一個數(shù)組里冯袍,以數(shù)組元素的形式返回雇卷。
示例: 聲明一個求平方的函數(shù)
function square(a){
return a * a
}
函數(shù)表達(dá)式
函數(shù)表達(dá)式是使用function關(guān)鍵字定義的函數(shù)表達(dá)式。
語法
function (){
//代碼塊
return 值
}
- 函數(shù)表達(dá)式是一個匿名代碼塊颠猴。
- 函數(shù)表達(dá)式不會聲明變量关划。
- 把函數(shù)表達(dá)式賦值給一個變量或常量取決于開發(fā)者。最佳實(shí)踐是把函數(shù)賦值給常量翘瓮,防止因意外而重寫函數(shù)贮折。
- 函數(shù)表達(dá)式不能再程序中單獨(dú)存在。因?yàn)榻馕銎饔龅?code>function關(guān)鍵字會看做函數(shù)聲明語句资盅,必須告訴解析器這是函數(shù)表達(dá)式调榄,比如:
方法1:使用小括號
(function(){})
方法2:賦值給常量
const fn = function(){}
注意: f() 與 f = function(){}
的區(qū)別
函數(shù)聲明語句在函數(shù)定義的語句之前是可以調(diào)用的踊赠。
在函數(shù)表達(dá)式在賦值給變量之前是無法調(diào)用函數(shù)的。
箭頭函數(shù)
是什么
箭頭函數(shù)是一種語法糖每庆,使用特別簡潔的語法定義函數(shù)筐带。
- 使用箭頭分隔函數(shù)參數(shù)和函數(shù)體;
- 不必使用function關(guān)鍵字(箭頭函數(shù)是表達(dá)式而不是語句)
- 不需要函數(shù)名
const sum = (x,y) => { return x + y }
- 如果函數(shù)體只有一個return語句,可以省略return關(guān)鍵字和花括號
const sum = (x, y) => x + y
- 如果只有一個參數(shù)缤灵,可以省略小括號
const sum = x => x + x
- 如果沒有參數(shù)伦籍,必須書寫小括號
const sum = () => console.log('hello world')
- 如果函數(shù)體的返回值是一個return語句,要返回的是一個對象字面量表達(dá)式腮出,則必須把對象放在小括號里
const f = x => { return {x: 'zhangsan'} }//正確
const f = x => ( {x: 'zhangsan'} )//正確
const f = x => {x: 'zhangsan'} //錯誤帖鸦;什么也不返回
const f = x => {x:'zhangsan',age: 19} //語法錯誤
語法糖(syntatic sugar)是一計(jì)算機(jī)編程語言的術(shù)語,用于描述一種語言的特性胚嘲,它可以讓您更輕松地做某事/輸入更少的內(nèi)容作儿,但實(shí)際上并沒有向該語言添加任何它尚不具備的新功能。
箭頭函數(shù)的區(qū)別
- 箭頭函數(shù)從定義上下文繼承this關(guān)鍵字的值(而非調(diào)用上下文)
- 箭頭函數(shù)沒有prototype屬性(不能作為新類構(gòu)造函數(shù)使用)
======2.調(diào)用函數(shù)======
當(dāng)創(chuàng)建了一個函數(shù)之后馋劈,如果需要使用它攻锰,就必須要去調(diào)用它,調(diào)用函數(shù)的方法有五種:
- 函數(shù)調(diào)用
- 方法調(diào)用
- 構(gòu)造函數(shù)調(diào)用
- 間接調(diào)用
- 隱式函數(shù)調(diào)用
函數(shù)調(diào)用
函數(shù)調(diào)用就是通過表達(dá)式調(diào)用函數(shù)妓雾。函數(shù)表達(dá)式只需要在函數(shù)名后加一對小括號即可口注。小括號內(nèi)傳入實(shí)際的參數(shù),如果有多個參數(shù)君珠,請使用逗號分隔寝志。
語法
funtionName( 實(shí)參1,實(shí)參2,實(shí)參3,...,實(shí)參N )
- 實(shí)參: 是調(diào)用函數(shù)時,通過形參傳入到函數(shù)內(nèi)的實(shí)際的參數(shù)策添。所有的實(shí)參都是為了計(jì)算函數(shù)返回值而出現(xiàn)的材部。
示例: 調(diào)用square()函數(shù)
square(10) // 100
思考:形參數(shù)量和實(shí)參數(shù)量是否必須一致?答案是否定的唯竹。了解相關(guān)內(nèi)容乐导,請查閱“arguments'對象。作為函數(shù)的初學(xué)者浸颓,最好讓形參與實(shí)參數(shù)量保持一致物臂。
方法調(diào)用
待補(bǔ)充
構(gòu)造函數(shù)調(diào)用
待補(bǔ)充
間接調(diào)用
待補(bǔ)充
隱式函數(shù)調(diào)用
待補(bǔ)充
======3.函數(shù)參數(shù)======
參數(shù)是什么?
參數(shù)是函數(shù)調(diào)用時产上,傳入到函數(shù)體內(nèi)的值棵磷。在函數(shù)體內(nèi)對值進(jìn)行處理,把處理的結(jié)果使用return返回出去晋涣。
參數(shù)的分類
形參:形式上的參數(shù)仪媒。形參出現(xiàn)在定義函數(shù)時。形參是函數(shù)體內(nèi)的局部變量谢鹊。(只不過省略了var聲明而已) 算吩。形參用于接收實(shí)參留凭。 英文:parameter => para
實(shí)參:實(shí)際傳入的參數(shù)。實(shí)參出現(xiàn)在調(diào)用函數(shù)時偎巢。實(shí)參是傳入函數(shù)體內(nèi)的值蔼夜。實(shí)參通過形參傳入函數(shù)體內(nèi)。英文:arguments => args
一般我們需要對參數(shù)進(jìn)行驗(yàn)證压昼。因?yàn)閖s函數(shù)定義不指定參數(shù)類型求冷。js函數(shù)調(diào)用不檢測參數(shù)個數(shù)。
參數(shù)驗(yàn)證
//
function sum(a,b){
if(b){
return a + b
} else if(a){
return a
} else {
return 0
}
}
let result = sum(4,6,8)
console.log(result)
形參默認(rèn)值
當(dāng)函數(shù)調(diào)用時沒有傳遞值或傳遞undefined進(jìn)來時巢音,形參默認(rèn)值允許我們對形參使用初始化值。
示例:形參初始化
function sum(a=0,b=0){
return a + b
}
let result = sum()
console.log(result)
使用默認(rèn)參數(shù)尽超,不再需要檢查函數(shù)體」俸常現(xiàn)在可以將 0作為函數(shù)頭中 b 的默認(rèn)值。
function multiply(a, b) {
a = typeof a !== "undefined" ? a : 0;
b = typeof b !== "undefined" ? b : 1;
return a * b;
}
multiply(5, 2); // 10
multiply(5); // 5
multiply(); // 0
示例:先定義的參數(shù)可用于形參默認(rèn)值
function greet(name, greeting, message = `${greeting} ${name}`) {
return [name, greeting, message];
}
greet("David", "Hi"); // ["David", "Hi", "Hi David"]
greet("David", "Hi", "Happy Birthday!"); // ["David", "Hi", "Happy Birthday!"]
arguments對象
示例:利用arguments對象向函數(shù)體內(nèi)傳遞參數(shù)
function sum(){
let len = arguments.length
let sum = 0
for(let i=0;i<len;i++){
sum += arguments[i]
}
return sum
}
let result = sum(4,6)
console.log(result)
示例:求和
function sum(a,b,...args){
let num = a + b
for(n of args){
num = num + n
}
return num
}
let result = sum(4,6,3,7,5)
console.log(result)
arguments是什么
- 向函數(shù)體內(nèi)傳遞實(shí)參的第二種方法
- arguments是一個函數(shù)體內(nèi)的內(nèi)置對象似谁。
- arguments是一個類數(shù)組對象
- 通過arguments對象可以訪問調(diào)用函數(shù)時的全部實(shí)參
什么時候使用arguments對象傲绣?
當(dāng)實(shí)參數(shù)目不確定的時候,可以考慮使用arguments對象巩踏。但是在新寫的代碼中應(yīng)該盡量避免使用它秃诵,它效率低且難優(yōu)化。通橙恚可以將其替換為...args
剩余參數(shù)菠净。
注意: 箭頭函數(shù)內(nèi)不存在arguments對象。
剩余形參(...rest)
當(dāng)實(shí)參數(shù)量不確定時彪杉,可以考慮使用剩余形參(...rest)毅往。
示例:
//需求:接收一個或多個實(shí)參,返回其中最大值派近。
function max(a,...rest){
let maxValue = -Infinity
for(n of rest){
if(n > maxValue){
maxValue = n
}
}
return maxValue
}
let result = max(1,10,100,1000)
console.log(result)
剩余形參(...rest)的語法
- 剩余形參rest前面有三個點(diǎn)
- 剩余形參必須是函數(shù)聲明的最后一個參數(shù)
- 實(shí)參先傳入形參攀唯,后傳入剩余形參
- 剩余形參是一個數(shù)組