javascript(閉包,立即執(zhí)行函數(shù),作用域等)

圖例

所謂“閉包”,指的是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該表達(dá)式的一部分。
在我個(gè)人理解,當(dāng)函數(shù)a的內(nèi)部函數(shù)b被外部變量c引用時(shí),就形成了閉包

對(duì)于setTimeout函數(shù),語(yǔ)法:setTimeout(code,millisec) 參數(shù)一為代碼,參數(shù)二為毫秒數(shù)

在這個(gè)例子里面有幾個(gè)js里面經(jīng)常會(huì)面對(duì)的知識(shí)點(diǎn),閉包,立即執(zhí)行函數(shù),作用域,所有可知要注意到第一個(gè)setTimeout里面匿名函數(shù),這部分其實(shí)是放在for循環(huán)之后才會(huì)執(zhí)行的,因?yàn)樗且粋€(gè)異步執(zhí)行的函數(shù),被放到了事件隊(duì)列里最后執(zhí)行。而且,每次setTimeout里面的函數(shù)執(zhí)行時(shí)可以近似理解為是一次實(shí)例化。
1.?對(duì)于a
在計(jì)算a時(shí),需要用到i,這里涉及到作用域鏈的知識(shí),最內(nèi)層的函數(shù)沒(méi)有i的值,它會(huì)沿著鏈?zhǔn)浇Y(jié)構(gòu)一直向上查找,最終發(fā)現(xiàn)i是for循環(huán)執(zhí)行之后的值。此時(shí),i的循環(huán)完成,最后一次i++之后,i已經(jīng)變成了4。這樣,setTimeout執(zhí)行3次實(shí)例化,每次i的值是不變的,最終值為a=4+4+4=12。
2.對(duì)于b
類似于a,在執(zhí)行setTimeout里的函數(shù)時(shí),需要找到i2的值,最終我們找到的是for循環(huán)到第三次時(shí)i2=i=3。(i2不會(huì)等于4,因?yàn)榈阶詈笠淮蝘++之后,已經(jīng)不會(huì)再進(jìn)入循環(huán)體了)。所以類似上面,b的值是3+3+3=9。
3.對(duì)于c
這部分就涉及到閉包的理解了。在循環(huán)過(guò)程中,通過(guò)立即執(zhí)行函數(shù)創(chuàng)建了閉包,每次i3都會(huì)被賦予當(dāng)次循環(huán)時(shí)i的值并保存,i3的值依次為1,2,3,最終c=1+2+3=6。

結(jié)果


?圖2 結(jié)果

對(duì)js的這個(gè)方面會(huì)持續(xù)更新中,以上本人愚見(jiàn),望指教。

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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