JavaScript基礎(chǔ)(十九)一閉包和Promise

?閉包

1、概述

閉包是一種書寫代碼,這種結(jié)構(gòu)擁有的特性就是內(nèi)部的空間在使用中不會被回收。(內(nèi)部的變量以及對應(yīng)的參數(shù)不會被gc回收)


2、函數(shù)的預(yù)編譯過程?

(1)、開辟函數(shù)的內(nèi)存空間。

(2)、開辟一個代碼的對應(yīng)的內(nèi)存空間。

(3)、將對應(yīng)的代碼塊引用放入這個函數(shù)的內(nèi)存空間。


3、函數(shù)的執(zhí)行過程

(1)、開辟一個執(zhí)行空間(執(zhí)行棧)。

(2)、將對應(yīng)的函數(shù)的里面的代碼寬內(nèi)容放到方法執(zhí)行棧中進行執(zhí)行。

(3)、執(zhí)行完對應(yīng)的執(zhí)行空間銷毀?那么對應(yīng)的里面的代碼塊內(nèi)容也就銷毀(gc回收)。


示例:


函數(shù)嵌套函數(shù)(返回函數(shù)),內(nèi)部函數(shù)保持對應(yīng)外部函數(shù)的變量(參數(shù))的引用。這個稱為閉包(外部的變量不會被gc回收) 。


4、閉包的特性

(1)、可以通過內(nèi)部函數(shù)引用,在調(diào)用內(nèi)部函數(shù)的過程中訪問外部函數(shù)的變量。

(2)、外部函數(shù)的參數(shù)不會被gc回收。

(3)、內(nèi)部函數(shù)時刻保持對應(yīng)外部函數(shù)的引用。


5、閉包的優(yōu)點

(1)、不會被gc回收。

(2)、擴大外部函數(shù)內(nèi)變量的使用范圍。

(3)、避免函數(shù)內(nèi)的變量被外部所污染。


6、閉包的運用

(1)、作為緩存。

(2)、防抖?節(jié)流。

(3)、函數(shù)柯里化。


防抖

概述:在固定時間內(nèi)只執(zhí)行一次(執(zhí)行最后一次)


1、a 進入電梯 等待5s后 就可以上升了。

2、在a等待了4s中后 b過來 那么之前的等待就結(jié)束了 ,開始新的等待。

3、在b等待了3s后 c過來 那么之前的等待也結(jié)束了, 開始新的等待。

4、直到最后一次等待結(jié)束 電梯就上升 。(實際電梯上升這個操作 只執(zhí)行一次 是最后一次)

示例:



節(jié)流

概述:在一定時間范圍內(nèi),執(zhí)行?第一次(減少執(zhí)行次數(shù))



函數(shù)柯里化(顆?;?/h1>

概述:?拆,將一個多個參數(shù)的函數(shù),拆分為多個一個參數(shù)的函數(shù),調(diào)用后續(xù)更好更改。

參數(shù)傳滿了,返回的是對應(yīng)的值,參數(shù)沒傳滿返回的是函數(shù)本身的函數(shù)。


Promise

概述:promise是e36新增的用于解決回調(diào)地獄問題?的一個類

回調(diào)地獄


吃飯->hello->hi?

回調(diào)函數(shù)解決了異步的問題



hello->hi->吃飯?

概述:回調(diào)函數(shù)的無限嵌套,這個被稱為回調(diào)地獄,他并不報錯,只是失去了代碼的可維護性以及閱讀性。?


Promise

promise可以解決異步的執(zhí)行問題,被設(shè)計為同步的,內(nèi)部是異步的(異步代碼)

promise是es6新增的類,他可以通過new關(guān)鍵詞來構(gòu)造(里面?zhèn)鬟f的是一個函數(shù),這個函數(shù)里包含了兩個形參)


promise有三種狀態(tài):等待、成功、失敗。

成功狀態(tài)(做相關(guān)處理)?then表示成功以后調(diào)用的函數(shù)。(resolve函數(shù))

失敗狀態(tài)(做相關(guān)處理)catch表示失敗以后調(diào)用的函數(shù)。(reject函數(shù))

等待狀態(tài) (沒有處理)


resolve里面?zhèn)鬟f的函數(shù)會到then里面

reject里面?zhèn)鬟f的函數(shù)回到catch里面


Promise的靜態(tài)方法

1、all 傳入一個promise數(shù)組 并行執(zhí)行 返回一個promise實例(所有的成功才會返回成功的 有一個失敗直接返回的失?。?/h4>

//then調(diào)用 要等所有成功了的才能返回 .catch 只要有一個reject調(diào)用它就會觸發(fā)

//? promise1 ?promise2?? 2? promise3???promise4

2、race 競速 傳入一個promise數(shù)組 并行執(zhí)行里面promise 返回第一個執(zhí)行的完的promise實例


//競速 并行執(zhí)行里面promise 返回最先執(zhí)行完的promise(不管是成功還是失?。?/h4>

3、reject 傳遞一個數(shù)據(jù) 返回一個失敗的promise對象


4、resolve 傳遞一個數(shù)據(jù) 返回一個成功的promise對象


5、allSettled 傳遞一個promise數(shù)組 不相互依賴執(zhí)行 返回一個promise實例 里面包含了所有執(zhí)行的promise結(jié)果(有一個成功就成功了)



Promise的非靜態(tài)方法


then(成功的處理)

catch(失敗的處理)

finally(不管成功還是失敗都會調(diào)用?finally)


Promise解決回調(diào)地獄

通過then方法里面返回一個新的的promise對象來解決回調(diào)地獄的問題



es7 async await

概述:es7新增async和await關(guān)鍵詞,async用于修飾函數(shù),await是用來修飾promise,async修飾的函數(shù)會返回一個新的promise對象,await只能在async修飾的函數(shù)內(nèi)使用。await會使當(dāng)前的線程陷入阻塞,只有當(dāng)前await修飾的promise完成后面的才能執(zhí)行( 當(dāng)前線程才會放開 )。

async?

(1)、修飾函數(shù)的會返回新的promise對象。

(2)、return相當(dāng)于promise?resolve調(diào)用?會將返回值傳遞給對應(yīng)的then。

(3)、報錯?相當(dāng)于promise?reject調(diào)用?會將返回值傳遞給對應(yīng)的catch。



await

await 只能在async里面使用,等待它會使當(dāng)前的線程進行等待(只有當(dāng)前的promise執(zhí)行完(不管成功還是失敗)它才會放開當(dāng)前等待)


宏任務(wù)和微任務(wù)

宏任務(wù) js引擎執(zhí)行的叫做宏任務(wù)(異步的) (setTimeout setInterval 以及對應(yīng)的事件等...)

微任務(wù) 宏任務(wù)里面promise是微任務(wù) (then catch finally 微任務(wù))

先走同步,再走異步


EventLoop 事件輪詢?

一個執(zhí)行機制 將對應(yīng)的執(zhí)行代碼放在執(zhí)行棧里面執(zhí)行, 輪番執(zhí)行對應(yīng)的任務(wù)

宏任務(wù)隊列 里面是一個個的宏任務(wù)(排序按照對應(yīng)的調(diào)用順序 setTimeout放在最后)



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

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

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