在使用for循環(huán)的時(shí)候,假如需要在循環(huán)體中添加一個(gè)匿名函數(shù)處理其他的事情,那么,在這個(gè)匿名函數(shù)內(nèi),如果需要用到對(duì)應(yīng)的i,因?yàn)殚]包的緣故,循環(huán)體循環(huán)結(jié)束后才返回i,所以i最終為最后一次++的數(shù)值。

 

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

 

閉包即函數(shù)有權(quán)訪問(wèn)另一函數(shù)的局部變量,常用方法為在函數(shù)內(nèi)部創(chuàng)建另一個(gè)需要引用這個(gè)函數(shù)內(nèi)部變量的函數(shù)。

 

解決方式1

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

 

通過(guò)匿名函數(shù)傳參,因?yàn)槟涿瘮?shù)取得參數(shù)是每次for循環(huán)里的i,所以每次打印的值為0,1,2,......

 

匿名函數(shù)自我執(zhí)行的方法是,在函數(shù)體外套一對(duì)圓括號(hào),形成一個(gè)表達(dá)式,在圓括號(hào)后再加另一個(gè)圓括號(hào),里面可傳參數(shù)。此方法即IIFE,又叫立即執(zhí)行函數(shù)表達(dá)式。

寫到這里,還需要說(shuō)一下函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別:

1.函數(shù)聲明必須有標(biāo)識(shí)符,即函數(shù)名;

2.函數(shù)聲明存在變量提升;

3.函數(shù)聲明不能出現(xiàn)在循環(huán),判斷、try、with等語(yǔ)句的代碼塊中;

 

 

解決方式2

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

此方法和上述方法有異曲同工之妙,也是在匿名函數(shù)體外部取到了循環(huán)體中的i;

 

在JS中,每一個(gè)函數(shù)被調(diào)用的時(shí)候都會(huì)創(chuàng)建一個(gè)執(zhí)行上下文,在該函數(shù)內(nèi)部定義的變量和函數(shù)只能在該函數(shù)內(nèi)部被使用,正是因?yàn)檫@個(gè)上下文,使得我們?cè)谡{(diào)用函數(shù)的時(shí)候能創(chuàng)建一些私有變量。

 電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

為什么a()()兩次打印都是1,是因?yàn)槊看螆?zhí)行a()()的時(shí)候都給a重新賦值1,而b()/c()執(zhí)行的只是a return出來(lái)的匿名函數(shù);

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

為什么報(bào)錯(cuò)?

因?yàn)樵趈avascript解析代碼時(shí),當(dāng)遇到function關(guān)鍵字時(shí),會(huì)默認(rèn)把它當(dāng)作一個(gè)函數(shù)聲明,而不是函數(shù)表達(dá)式,如果沒(méi)有顯示的表達(dá)成函數(shù)表達(dá)式,就報(bào)錯(cuò)。因?yàn)楹瘮?shù)聲明需要一個(gè)函數(shù)名,而上面的代碼中函數(shù)沒(méi)有函數(shù)名。(在執(zhí)行到第一個(gè)左括號(hào)時(shí)報(bào)錯(cuò))

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

為什么在加了函數(shù)名之后,依然報(bào)錯(cuò)?

在一個(gè)表達(dá)式后面加上括號(hào)表示立即執(zhí)行,而在一個(gè)語(yǔ)句后加上括號(hào),該括號(hào)和之前的語(yǔ)句完全不搭邊,而只是一個(gè)分組操作符,用來(lái)控制運(yùn)算中的優(yōu)先級(jí),當(dāng)js解析到括號(hào)時(shí),發(fā)現(xiàn)里面為空,所以報(bào)錯(cuò)。(在執(zhí)行到第二個(gè)右括號(hào)時(shí)報(bào)錯(cuò))

 

因?yàn)樵趈s中括號(hào)內(nèi)部不能為語(yǔ)句,所以js解析到括號(hào)時(shí),緊接著發(fā)現(xiàn)了function關(guān)鍵字,所以自動(dòng)把括號(hào)內(nèi)的語(yǔ)句當(dāng)作表達(dá)式而不是函數(shù)聲明。

所以,立即執(zhí)行函數(shù),你可以這么寫:

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁(yè)設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

 

 

而上面我們用立即執(zhí)行函數(shù)加閉包,取到了循環(huán)體中的i;可見合理利用立即執(zhí)行函數(shù)加上閉包,還能保存變量的狀態(tài)。

在模塊化中,也可以用立即執(zhí)行函數(shù)來(lái)處理模塊化,可以減少全局變量造成的空間污染,構(gòu)造更多的私有變量。