·ECMAScript函數(shù):
?????? 函數(shù)對任何語?來說都是?個核?的概念。通過函數(shù)可以封裝任意多條語句,?且可以在任何地?、任何時候調(diào)?執(zhí)?。ECMAScript中的函數(shù)使?function關(guān)鍵字來聲明,后跟?組參數(shù)以及函數(shù)體。
函數(shù)的基本語法如下所?:
? ? ? ? ??function functionName(arg0, arg1,...,argN) { ???
??????????????????? statements //封裝的函數(shù)語句
????????? }
????????? functionName(a,b,......,k)
????????? 注:arg0, arg1,...,argN為形參,
????????????????? a,b,......,k為實參,
????????????????? 參數(shù)如果有多個,可以?逗號隔開。
????????????????? 形參的類型由實參的類型決定。
????????????????? 形參這個占位符是等待未來傳遞過來實際值而設置的變量。
????????????????? 形參和實參都沒有個數(shù)限制,并且將實參賦值給形參是按照順序賦值的。
????????????????? 實參的個數(shù)不一定與形參的個數(shù)相同,且沒有實參賦值的形參默認值是undefined。
????????????????? 如果實參的個數(shù)大于形參,?那么沒有形參接受的實參將會被忽略。
????????? 以下是?個函數(shù)?例:
?????????????????? function sayHi(name, greet) {
??????????????????????????? alert("Hello " + name + "," + greet);
??????????????????? }
??????????????????? sayHi("Ninxue", "how are you today?");
??????????????????? 這個函數(shù)的輸出結(jié)果是:"Hello Ninxue,how are you today?"。
??????????????????? 函數(shù)定義中的命名參數(shù)name和greet被?作了字符串拼接的操做方式。
函數(shù)特性:
???????????????????? (1)函數(shù)內(nèi)部的代碼是相對封閉的,跟函數(shù)外的代碼沒什么關(guān)系。
?????????????????? ? (2)函數(shù)的作用是:用來封裝功能。減少代碼復用量。
???????????????????? (3)函數(shù)內(nèi)部是相對獨立的。
???????????????????? (4)有名函數(shù):命名函數(shù)表達式:let?fn =?function?()?{ },
????????????????????????????? 即:用var , let等聲明變量的方式將函數(shù)體賦值給一個變量名。
????????????????????????????? 匿名函數(shù):function fn () { } , 即:函數(shù)自命名的。
????????????????????????????? 注:無論是有名函數(shù)還是匿名函數(shù)正常寫法都需要進行函數(shù)調(diào)用 fn()。
???????????????????????????????????? 可多次調(diào)用同一函數(shù),但是函數(shù)名不可重復命名。
???????????????????? (5)匿名函數(shù)自執(zhí)行:
????????????????????? ? ? ? ? ? ? ?? IIFE:即時調(diào)用函數(shù)表達式,自執(zhí)行功能。
???????????????????????????????????? Es5的匿名函數(shù)自執(zhí)行寫法:
???????????????????????????????????????????????????????? 1.?(function?(){})()
?????????????????????????????????????????????????????? ? 2.?(function?(){}())
???????????????????????????????????????????????????????? 3.?+function(){}()
???????????????????????????????????????????????????????? 4.?-function(){}()
???????????????????????????????????????????????????????? 5.?~function(){}()
???????????????????????????????????????????????????????? 6.?!function(){}()
????????????????????? 例子:設計一個函數(shù)接收三個參數(shù),如product(2,5,9),返回值是前兩個數(shù)字大的那個數(shù)與第三個數(shù)字的乘積。

????????????????????? 注:javascript中的return是只能放在function中的,也就是說如果把上面的if/else放在一個function里就可以了。再或者,把return寫成閉包就好了。

????????????????????????????????????
Es6的匿名函數(shù)自執(zhí)行寫法例子:
???????????????????????????????????? 塊作用域自執(zhí)行控制臺輸入密碼關(guān)鍵字password無法訪問輸入的密碼值。
?????????????????????????????????????????? ????{?//?塊作用域
??????????????????????????????????????????????????? let?pwd?=?document.getElementById('pwd')
??????????????????????????????????????????????????? let?btn?=?document.getElementById('btn')
??????????????????????????????????????????????????? let?password?=?""?//?用來存儲用戶的密碼
??????????????????????????????????????????????????? btn.onclick?=?function?()?{
?????????????????????????????????????????????????????????? password?=?pwd.value
?????????????????????????????????????????????????????????? // console.log(password)
?????????????????????????????????????????????? ???? }
?????????????????????????????????????????????? }
函數(shù)的參數(shù):
??????????????????????? 命名的參數(shù)只提供便利,但不是必需的。
??????????????????????? 函數(shù)聲明時,定義的占位形式參數(shù):形參。調(diào)用時傳入的實際參數(shù):實參。
??????????????????????? 形參:用于接收函數(shù)在調(diào)用時,傳入的實際數(shù)據(jù),命名規(guī)則跟變量的命名規(guī)則統(tǒng)一。
??????????????????????? 實參:函數(shù)調(diào)用時傳入的實際數(shù)據(jù),該數(shù)據(jù)會被自動傳給對應位置的形參。
??????????????????????? 形參的默認值:直接在形參后寫等號,有默認值的形參必須出現(xiàn)在沒有默認值
??????????????????????? 的后面。否則會出錯。
??????????????????????? 注:函數(shù)整體可以作為另外一個函數(shù)的參數(shù)。

不定參arguments:
???????? 1.arguments:是函數(shù)內(nèi)部的一個關(guān)鍵字,用于接收所有的實參,在ES6后取消了arguments。
???????? 2.arguments?是一個類數(shù)組,有l(wèi)ength屬性。
???????? 3.可以通過訪問arguments對象的length屬性可以獲知有多少個參數(shù)傳遞給了函數(shù)。
???????? 4.使用例子:
?????????? ???????????????? function add () {
?????????????????????????????????? var res = 0;
?????????????????????????????????? for(var i = 0; i < arguments.length; i++){
???????????????????????????????????????? res += arguments[ i ]
?????????????????????????????????? }
?????????????????????????????????? console.log(res)
??????????????????????????? }
??????????????????????????? add(1,2)?????? // 3
??????????????????????????? add(1,2,3)??? // 6
??????????????????????????? add(2,3,5,6)?? //16
???????? 5.在ES6里沒有不定參arguments,取而代之是剩余參數(shù)。
??????????? 注:剩余參數(shù)只能出現(xiàn)在函數(shù)的最后一個形參的位置上。
??????????? 例如:
???????????????????? function add (a,b,...rest) {
??????????????????????????? console.log(rest)
???????????????????? }
???????????????????? add(1,2)?????? // [ ]
???????????????????? add(1,2,3)??? // [3]
???????????????????? add(1,2,3,4,5)?? //[3,4,5]
返回值:
??????????????? 1、return?返回值到外界。
??????????????? 2、如果函數(shù)內(nèi)出現(xiàn)return,則當代碼執(zhí)行return語句時,會立刻停止函數(shù)執(zhí)行,
????????????????????? 并返回return后面的值給外界。
??????????????? 3、一個函數(shù)內(nèi)可以寫n多個return,?但是一個函數(shù)內(nèi)只有第一個return會執(zhí)行。
??????????????? 4、當函數(shù)內(nèi)沒有寫return時,函數(shù)執(zhí)行結(jié)束后默認return?undefined。
遞歸方法:
?????????????????????? 遞歸:一個函數(shù)平凡調(diào)用自身。
?????????????????????? 遞歸的規(guī)律:先執(zhí)行的最后執(zhí)行完。
?????????????????????? 例子:

??????????????? 注:雖然遞歸的規(guī)律求值可以用for循環(huán)來編寫,但是也可以用于一些特殊情況簡化代碼。
函數(shù)聲明的提升(預解析):
JS執(zhí)行過程:先預編譯(解析)過程,再把所有的函數(shù)聲明都提升到最開頭,然后再按順序執(zhí)行。
?????????????? 注:函數(shù)聲明會被提升,但是函數(shù)表達式卻不會被提升。
???????????????? 1.函數(shù)聲明的方式定義一個函數(shù):
???????????????????????????????????????????????????????????????????? function?fn()?{}
??? ? ? ? ? ? ? 2.?函數(shù)表達式的方式定義函數(shù):
??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? var?fn?=?function?()?{}
??????????????? 3.?函數(shù)類型:為引用數(shù)據(jù)類型?function

??????????? 注:如果變量名和函數(shù)名重名的話,?以函數(shù)為優(yōu)先。正常情況下給同一個變量賦予不同的值,都是后面的值覆蓋前面的值。
