|
作者:蟲哥寫代碼,來自原文地址 看到標(biāo)題“閉包”很多人會(huì)覺得懵逼包括我在內(nèi),之前對(duì)閉包有所聽聞但始終無法準(zhǔn)確全面的了解。對(duì)于前端同學(xué)無論在面試還是在開發(fā),都逃不過關(guān)于閉包的問題。最近小程序項(xiàng)目中遇到變量訪問權(quán)限的問題一時(shí)間沒考慮到閉包,郁悶了,在此感謝@Topqiang給我指點(diǎn)。本文閱讀一遍不一定能夠理解掌握,需要反復(fù)推敲和練習(xí),有疑問歡迎隨時(shí)在下方評(píng)論。
在網(wǎng)上搜索學(xué)習(xí)關(guān)于閉包的技術(shù)時(shí)發(fā)現(xiàn)講的都比較抽象【我是菜鳥】,不好理解閉包的概念以及使用方法。今天我們帶著疑問去學(xué)習(xí):首先我給大家還原一下需求場(chǎng)景;對(duì)需求場(chǎng)景進(jìn)行分析;引入閉包解決方案;升華閉包概念理解。廢話少說直接步入正題。
還原需求場(chǎng)景
我要實(shí)現(xiàn)一個(gè)未知的多對(duì)多的數(shù)據(jù)請(qǐng)求并加載到頁(yè)面中,由于后端接口限制,不支持多對(duì)多的同步返回,需要前端去做數(shù)據(jù)匹配處理。
下面來看看這種需求場(chǎng)景下,小程序前端代碼是什么樣子
按照常規(guī)雙層for循環(huán)邏輯來理解是沒有問題的,內(nèi)層訪問外層變量去遍歷list
需求場(chǎng)景分析
這種需求下有同學(xué)會(huì)考慮后臺(tái)將雙層數(shù)據(jù)處理后返回給前端,但是如果后端考慮業(yè)務(wù)功能的解耦不做此操作,我們還是要解決這個(gè)問題。親測(cè)單純的雙層for循環(huán)中內(nèi)層訪問外層變量是Ok的,加入wx.request過后內(nèi)層將無法正常訪問外層循環(huán)變量 i 。如果外層數(shù)據(jù)res.data的長(zhǎng)度為3,那么i在外層for循環(huán)中正常遍歷為:0、1、2;但是在內(nèi)層for循環(huán)中遍歷 i 的數(shù)據(jù)為:3、3、3,這個(gè)時(shí)候我對(duì)showdata.data賦值無法拿到完整的數(shù)據(jù),而只能拿到最后一遍遍歷出的數(shù)據(jù)。
分析到這里我們的目的就明確了,要想在內(nèi)層wx.request中的for循環(huán)中得到外層變量 i ,怎么實(shí)現(xiàn)呢?
閉包解決方案
JS閉包可以很輕松的解決內(nèi)層訪問外層存活的私有變量。下面給出3種解決方案,僅供參考。 方案一:增加若干個(gè)對(duì)應(yīng)的閉包域空間(這里采用的是匿名函數(shù)),專門用來存儲(chǔ)原先需要引用的內(nèi)容(下標(biāo)),不過只限于基本類型(基本類型值傳遞,對(duì)象類型引用傳遞)
方案二:增加若干個(gè)對(duì)應(yīng)的閉包域空間用來存儲(chǔ)下標(biāo),將事件綁定在新增的匿名函數(shù)返回的函數(shù)上
方案三:使用ES6新語(yǔ)法 let 關(guān)鍵字:塊作用域,不能重復(fù)聲明覆蓋,限制了變量的作用域,保證變量不會(huì)去污染全局變量
網(wǎng)上針對(duì)javascript解決閉包的方案還有很多,有興趣的朋友可以深入了解??戳诉@么多內(nèi)容不知道大家是否對(duì)微信小程序閉包有所了解。網(wǎng)上針對(duì)微信小程序閉包代碼搜索最多的是下圖:
升華閉包概念
閉包到底是什么?
作用和應(yīng)用場(chǎng)景
閉包的注意點(diǎn)
|