2020-09-10 函數(shù)

·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ù)字的乘積。

案例1

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

案例2

????????????????????????????????????

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ù)。

理解參數(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)先。正常情況下給同一個變量賦予不同的值,都是后面的值覆蓋前面的值。

案例題
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容