es6--函數(shù)新增

函數(shù)的擴(kuò)展

函數(shù)參數(shù)設(shè)置默認(rèn)值
...rest參數(shù)
箭頭函數(shù)
Promise函數(shù)
Generator 函數(shù)
async函數(shù)

11.函數(shù)的擴(kuò)展

(1)函數(shù)參數(shù)的設(shè)置
函數(shù)參數(shù)的默認(rèn)值:
例如 function myfun(x,y=0){},設(shè)置默認(rèn)值的參數(shù)會(huì)變成必穿參數(shù),不傳會(huì)報(bào)錯(cuò);
undefined,將觸發(fā)該參數(shù)等于默認(rèn)值,null則沒有這個(gè)效果
函數(shù)的length屬性,將返回沒有指定默認(rèn)值的參數(shù)個(gè)數(shù),設(shè)置默認(rèn)值后不會(huì)計(jì)入長(zhǎng)度之內(nèi),擴(kuò)展參數(shù)也不在len里面

rest 參數(shù):
(形式為...變量名),用于獲取函數(shù)的多余參數(shù),這樣就不需要使用arguments對(duì)象了,就是對(duì)象的擴(kuò)展運(yùn)算符;
rest 參數(shù)之后不能再有其他參數(shù)
函數(shù)的length屬性,不包括 rest 參數(shù)。
只要函數(shù)參數(shù)使用了默認(rèn)值、解構(gòu)賦值、或者擴(kuò)展運(yùn)算符,那么函數(shù)內(nèi)部就不能顯式設(shè)定為嚴(yán)格模式,否則會(huì)報(bào)錯(cuò)

(2)箭頭函數(shù)
var f = v => v;
var f = () => 5;
var sum = (num1, num2) => num1 + num2;
let getTempItem = id => ({ id: id, name: "Temp" });
let fn = () => void doesNotReturn(); //沒有返回值,只有一行語句

注意:
箭頭函數(shù)沒有自己的this對(duì)象。
不可以當(dāng)作構(gòu)造函數(shù),也就是說,不可以對(duì)箭頭函數(shù)使用new命令,否則會(huì)拋出一個(gè)錯(cuò)誤。
不可以使用arguments對(duì)象,該對(duì)象在函數(shù)體內(nèi)不存在。如果要用,可以用 rest 參數(shù)代替。
不可以使用yield命令,因此箭頭函數(shù)不能用作 Generator 函數(shù)。

(3)Promise函數(shù)

loopEvent事件循環(huán):執(zhí)行棧,異步對(duì)列,執(zhí)行對(duì)列;
js程序執(zhí)行代碼在執(zhí)行棧中,此時(shí)都是同步在執(zhí)行,但在運(yùn)行代碼時(shí)如果遇見事件綁定、計(jì)時(shí)器會(huì)將拋到異步任務(wù)隊(duì)列里面等待js引擎執(zhí)行,然后繼續(xù)執(zhí)行在執(zhí)行棧中的代碼,于此同時(shí),被拋到異步執(zhí)行隊(duì)列里面的計(jì)時(shí)器會(huì)執(zhí)行等待的時(shí)間,如果等待時(shí)間結(jié)束,則會(huì)將此事件拋到執(zhí)行隊(duì)列里面。執(zhí)行棧里面的代碼執(zhí)行完成后,程序會(huì)去檢查執(zhí)行隊(duì)列里面是否有事件,如果有,則拿出來執(zhí)行。如果沒有,則會(huì)一直循環(huán)檢查,直到異步事件隊(duì)列和執(zhí)行隊(duì)列里面都沒有才結(jié)束程序

同步:任務(wù)按列隊(duì)順序執(zhí)行
異步,任務(wù)進(jìn)入執(zhí)行狀態(tài)后及進(jìn)入下一個(gè)任務(wù)
回掉地獄:數(shù)據(jù)依賴于接口返回,多次嵌套網(wǎng)絡(luò)請(qǐng)求

定義promise函數(shù)
1,定義函數(shù),返回一個(gè)promise對(duì)象;例如:function getDetail(){new Promise((resolve,reject)=>{ api().then(resolve(res)) })};
2.函數(shù)使用,getDetail().then(res=>{. //拿到值了 })

promist:內(nèi)部拋出數(shù)據(jù)請(qǐng)求成功失敗結(jié)果,使用.then()調(diào)用解決回掉地獄;
promise.race(fun1(),fun2()):返回回掉相對(duì)快的結(jié)果
promise.all(fun1(),fun2()):返回所有結(jié)果為各自promise函數(shù)的回掉結(jié)果組成的數(shù)組

Promise.then().catch()
promise的缺點(diǎn):
(1)只有定義了promise實(shí)例,中途不能停止
(2)除非使用回掉,不會(huì)自動(dòng)拋出錯(cuò)誤
(3)當(dāng)處于 Pending 狀態(tài)時(shí),無法得知目前進(jìn)展到哪一個(gè)階段

(3)Generator 函數(shù)
generator函數(shù)與普通函數(shù)區(qū)別
1.普通函數(shù):一旦開始執(zhí)行,就會(huì)運(yùn)行到最后,或是遇到return返回,不會(huì)有其他代碼打斷
2.generator函數(shù):
定義語法:function* myfun(){ yield...}; (推薦緊挨著function關(guān)鍵字,可以有多個(gè)yield)
調(diào)用:let generator=myfun()直接調(diào)用函數(shù)返回一個(gè)遍歷器對(duì)象(Iterator Object);使用generator.next()方法,遍歷 Generator函數(shù)內(nèi)部的每一個(gè)狀態(tài)

(4)async函數(shù)
就是將 Generator 函數(shù)的星號(hào)(*)替換成async,將yield替換成await;是Generator函數(shù)的優(yōu)化提升;主要表現(xiàn)一下幾點(diǎn):
1.內(nèi)置執(zhí)行器??梢灾苯舆M(jìn)行,不用使用.next()調(diào)用
2.yield命令后面只能是 Thunk 函數(shù)或 Promise 對(duì)象,而async函數(shù)的await命令后面,可以是 Promise 對(duì)象和原始類型的值(數(shù)值、字符串和布爾值,但這時(shí)會(huì)自動(dòng)轉(zhuǎn)成立即 resolved 的 Promise 對(duì)象)。

語法:async function myfun(){ ...await... }
調(diào)用:myfun()

備注:
async 函數(shù)返回一個(gè) Promise 對(duì)象,可以使用 then 方法添加回調(diào)函數(shù)。
async 函數(shù)中可能會(huì)有 await 表達(dá)式,async 函數(shù)執(zhí)行時(shí),如果遇到 await 就會(huì)先暫停執(zhí)行 ,等到觸 發(fā)的異步操作完成后,恢復(fù) async 函數(shù)的執(zhí)行并返回解析值。
await 關(guān)鍵字僅在 async function 中有效。否則會(huì)報(bào)錯(cuò),后面跟一個(gè)promise對(duì)象;

Async函數(shù)屬于異步函數(shù),代碼執(zhí)行會(huì)放在異步任務(wù)隊(duì)列

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

相關(guān)閱讀更多精彩內(nèi)容

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