閉包,是開發中常見的問題了 ,最近文匯軟件小編在開發一視頻列表的時候遇到了這個問題接下來給大家分享一下。
那么什么是閉包呢?
接下來先看段代碼:

video標簽的個數是3個 ,所以b的值為3 ;循環內輸出變量i的值為0,1,2這個沒問題 ,在循環內給每個video注冊監聽事件 ,判斷video標簽的播放狀態來進行接下來事件的處理。這里打印i的值,邏輯下這個值應該是0,1或者2.哪個標簽在播放就輸出哪個值。接下來我們打印一下:

結果跟想象中的不一樣 ,不論播放哪個標簽。打印的值都是3。那么這是為什么呢?
a[i]這個里面的i會跟著for循環語句一個一個的變,而它后面的函數體里面的i是不同時隨著一起變的,不知道i為多少,只有當最后函數外面調用這個函數體時才會找這個語句里面i的值(console.log(i)調用了),而此時i已經變成了3(因為上面for循環執行到i = 2時i++,此時i = 2,但是i不滿足判斷條件,賦值語句不執行,但是i已經變成了3);這就是閉包!!!
那么如何解決這個問題?
js中沒有會計作用域,所以循環內函數調用時調用的是全局作用域里的值,也就是3;但是在ES6中let實際是為js新增了塊級作用域,那么我們改下代碼:

接下來打印下結果:

我們可以看到 ,輸出的結果是我們期望的,上述代碼中for循環之后的{}是塊級作用域,每次循環時候每個返回的函數引用的是其對應塊作用域的變量。i的值在for循環的作用域之外也是獲取不到的。
好了,今天文匯軟件小編就給大家介紹這些 ,大家可以自己試驗下哦 ,歡迎評論區留言討論更多前端知識。
上一篇: 如何使用css中的vw和vh



