Day17-JS函數(shù)詳解(一)

導(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ù)組
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市渴丸,隨后出現(xiàn)的幾起案子侯嘀,更是在濱河造成了極大的恐慌,老刑警劉巖谱轨,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戒幔,死亡現(xiàn)場離奇詭異,居然都是意外死亡土童,警方通過查閱死者的電腦和手機(jī)溪食,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娜扇,“玉大人错沃,你說我怎么就攤上這事栅组。” “怎么了枢析?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵玉掸,是天一觀的道長。 經(jīng)常有香客問我醒叁,道長司浪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任把沼,我火速辦了婚禮啊易,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饮睬。我一直安慰自己租谈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布捆愁。 她就那樣靜靜地躺著割去,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昼丑。 梳的紋絲不亂的頭發(fā)上呻逆,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音菩帝,去河邊找鬼咖城。 笑死,一個胖子當(dāng)著我的面吹牛呼奢,可吹牛的內(nèi)容都是我干的酒繁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼控妻,長吁一口氣:“原來是場噩夢啊……” “哼州袒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弓候,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤郎哭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菇存,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夸研,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年依鸥,在試婚紗的時候發(fā)現(xiàn)自己被綠了亥至。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姐扮,靈堂內(nèi)的尸體忽然破棺而出絮供,到底是詐尸還是另有隱情,我是刑警寧澤茶敏,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布壤靶,位于F島的核電站,受9級特大地震影響惊搏,放射性物質(zhì)發(fā)生泄漏贮乳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一恬惯、第九天 我趴在偏房一處隱蔽的房頂上張望向拆。 院中可真熱鬧,春花似錦酪耳、人聲如沸浓恳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奖蔓。三九已至赞草,卻和暖如春讹堤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厨疙。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工洲守, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沾凄。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓梗醇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撒蟀。 傳聞我的和親對象是個殘疾皇子叙谨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容