--- title: 新手小白聊Function tags: 文章發布,JavaScript description: 淺談Function是甚麼 date: 2022/03/22 --- :::info 前情提要:此為初入新手村的超級菜鳥,淺談JavaScript裡的【Function】(淺談結果寫超長),僅供參考~ 敬請指教修正:bow::bow::bow: ::: # 新手小白聊Function **Function f(x)=3x+2** 有沒有對於上方的公式看起來非常的熟悉,想到以前數學課一元一次方程式,二元一次方程式...好多好多的方程式,可怕的是滿天飛的xyz :confounded: 對於初入新手村的我而言,最最最最頭痛的莫過於:我甚麼時候要用function?甚麼時候要放參數?又甚麼時候會要return???? 等等!參數是甚麼? return又是甚麼??? (<font size="1px" color="#aaa">哎呀呀~頭都要開始痛了 :fearful::fearful::fearful:</font> --- :bell:**function是在定義輸入值(參數)與輸出值(結果)之間的關係, 並且給他一個名稱** ## 函數 Function 首先,我們先來看看以前熟悉的(或至少看過的)一元一次方程式, 以f(x)=3x+2為例: - 數學老師說:當你將==未知數x==等於1時,代入方程式裡面計算的方式會是像:f(1)=3x1+2這樣,x=1帶入,最後==得到一個結果==等於5。如果未知數x等於3時,代入則會得到11的答案,此未知數x也可以稱為變數,也就是會不斷改變的一個數字。 有沒有稍微有點點感覺啦~(<font size="1px" color="#aaa">好像沒有</font> 但有沒有發現,當方程式裡面的x代入各種數值的時候,這一個方程式f(x)=3x+2,就會給我一個答案,也因此它可以被==重複使用==。輸入一個值,給出一個值。就像你去便利商店買東西,給一塊錢得到一顆糖果:candy: 或許在此我們可以說 :bell:**當你有需要重複使用的事情時,就可以使用function** 那這樣在javaScript裡會是甚麼樣的呢? ```javascript= function hello() { //此hello為方程式的命名 console.log(123); console.log(456); console.log(789); } hello(); //印出123,456,789 ``` 函式結構:主要分為三個區域 - 函式的名稱,如範例*hello*為function的命名 - 包圍在小括號()裡面的為function的參數 - 包圍在大括號或稱花括號{}內的,為此function的作用區 關於函式 - 函式是構成javascript的基本要素之一 - 啟動的時候要連同小括號一起,呼叫function - function是一種物件(object)也是一種可以被呼叫的值 定義函式的方式 - 函式宣告(Function Declaration) - 函式運算式(Function Expressions) - 透過 new Function 關鍵字建立函式 --- ### :point_right:function的命名 在javaScript的結構上,可以幫function命名。能讓人較快速的知道此function是要進行什麼樣的事情。 命名的方式可分為 - 具名函式 Named Function - 匿名函式 Anonymous Function ```javascript= //沒有命名 const hello = function(){ console.log(123) } hello() //印出123 //有命名aaa const hello = function aaa(){ console.log(123) } hello() //印出123 ``` 至於要用哪一個好呢??還是要看實際的狀況判斷,具名的可以叫他的名字出來~就能重複使用。 #### 小堤外:箭頭函式arrow - ES6之後出現的東西,比原本的函式有更簡短的寫法。 - 只能拿來取代匿名函式但在物件導向的時候,本質不太一樣。 - 屬於匿名函式的一種,不能命名 ```javascript= //原本的寫法 const hello = function(){ console.log(123); } //箭頭函式的寫法 const hello = ()=>{ console.log(123); }; hello(); //印出123 ``` :mag_right: 後續延伸物件導向 --- --- ### :point_right:function的參數 寫在小括號()內的屬於function的參數,就像前面提到的未知數x一樣,就屬於參數,也是function的輸入值。 有別於以往數學上的未知數常用的只有xyz,在JS裡面,function的參數可以是number、list等這些看起來像英文單字的參數,他其實就是一個被帶入的值,所以長甚麼樣子都可以,只要他在她的{}內有找到相對應使用的功能就可以。 - 在function裡面的**參數可以有很多個**,並且用逗號區格 - 可以有**預設值**:讓function變得更有彈性,幫助流程控管,如果少帶引數給他的時候,就會出現預設值 - 可以用引數作為參數 - 也可以以物件作為參數 :mag_right: 甚麼是物件作為參數?後續延伸那些可以做參數使用 ```javascript= function hello(a, b) { //a,b是參數 console.log(a); console.log(b); } hello("aaa", 456); //"aaa",456是引數 //參數可以有預設值 function hello(a, b = 1, c = 2) { console.log(a); console.log(b); console.log(c); } hello("aaa", 456); //印出aaa,456,2 //沒有給第三個引數時,則出現參數的預設值=2 ``` 因此,同一個function被使用時,參數的數量不會不同,因為是**被定義**的,但引數的數量可能會不一樣(多給或少給),就像你每天固定要買麥當當,但媽媽可能多給你10元或是少給你5元,所以你只得到大麥克單點或是麥香雞套餐。(<font size="1px" color="#aaa">可以這樣比喻嗎:sweat_smile:</font> :question: 甚麼時候要用參數呢 當有引數需要被代入function時,就可以使用參數;就像是紙箱(function)一樣,把需要的工具(code block)放進去,需要用的時候打開紙箱(calling function)。 沒有參數的function就像是事件的集合體,直接進行作用區內的事情。 :::success :bulb:比較:引數(argument)與參數(paramter) - 引數是當我們呼叫函數時,傳遞給他的值 (媽媽給你錢) - 參數是我們在函式定義中所列出的變數 (你要買的麥當當) ::: ### :point_right:function的作用區`{}` 在大括號或稱花括號內,套用function的參數。就像數學f(x)={3x+2}給他一個大括號,他就在大括號內計算,最終給你一個值(結果)。在function內定義的變數與外層是不同的世界。 ```javascript= function fu() { let a = 'Ray'; } console.log(a); // a is not defined ``` ### :point_right:function的宣告 直接用function時,呼叫hello()放哪裡都可以 但如果有兩個function時,後面定義的會把前面的覆蓋 ```javascript= hello() function hello(){ console.log(123); console.log("aaa"); } //印出123,aaa ``` ```javascript= function hello(){ console.log(123); } function hello(){ console.log("aaa"); } hello() //印出aaa ``` :mag_right: 定義function的方式有哪些呢? --- :::warning :raised_hands:簡單小結論 - function是一個物件(object)也是一種值 - 可以被呼叫:透過名稱+小括號呼叫他 - 有屬於自己的作用區 - 可以帶入參數 - function也可以作為引數使用 - function裡面也可以包function ::: :mag_right:後續會再來談其他的宣告方式var/let/const,以及==function的return示甚麼== :scream::scream::scream:<font color="#f00">新手小白努力了解學習~持續修正調整更新中</font>:scream::scream::scream: --- :::spoiler **參考資料** - [mozilla函式-JavaScript](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Functions) - [有點長的淺談 JavaScript function 函式](https://w3c.hexschool.com/blog/cb6e361) - [學JS的心路歷程 Day7-函式(二) arguments](https://ithelp.ithome.com.tw/articles/10204008) - [重新認識 JavaScript: Day 10 函式 Functions 的基本概念](https://ithelp.ithome.com.tw/articles/10191549) ::: :::spoiler 延伸閱讀參考 - [隱含引數](https://ithelp.ithome.com.tw/articles/10204008) :::