閉包,是開發(fā)中常見的問題了 ,最近文匯軟件小編在開發(fā)一視頻列表的時候遇到了這個問題接下來給大家分享一下。
那么什么是閉包呢?
接下來先看段代碼:
video標簽的個數(shù)是3個 ,所以b的值為3 ;循環(huán)內輸出變量i的值為0,1,2這個沒問題 ,在循環(huán)內給每個video注冊監(jiān)聽事件 ,判斷video標簽的播放狀態(tài)來進行接下來事件的處理。這里打印i的值,邏輯下這個值應該是0,1或者2.哪個標簽在播放就輸出哪個值。接下來我們打印一下:
結果跟想象中的不一樣 ,不論播放哪個標簽。打印的值都是3。那么這是為什么呢?
a[i]這個里面的i會跟著for循環(huán)語句一個一個的變,而它后面的函數(shù)體里面的i是不同時隨著一起變的,不知道i為多少,只有當最后函數(shù)外面調用這個函數(shù)體時才會找這個語句里面i的值(console.log(i)調用了),而此時i已經(jīng)變成了3(因為上面for循環(huán)執(zhí)行到i = 2時i++,此時i = 2,但是i不滿足判斷條件,賦值語句不執(zhí)行,但是i已經(jīng)變成了3);這就是閉包?。?!
那么如何解決這個問題?
js中沒有會計作用域,所以循環(huán)內函數(shù)調用時調用的是全局作用域里的值,也就是3;但是在ES6中l(wèi)et實際是為js新增了塊級作用域,那么我們改下代碼:
接下來打印下結果:
我們可以看到 ,輸出的結果是我們期望的,上述代碼中for循環(huán)之后的{}是塊級作用域,每次循環(huán)時候每個返回的函數(shù)引用的是其對應塊作用域的變量。i的值在for循環(huán)的作用域之外也是獲取不到的。
好了,今天文匯軟件小編就給大家介紹這些 ,大家可以自己試驗下哦 ,歡迎評論區(qū)留言討論更多前端知識。