欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript新手必看之var在for循環(huán)中的坑

 更新時間:2023年05月25日 09:31:04   作者:JetTsang  
var這個關(guān)鍵字在JS當(dāng)中是相當(dāng)常用的,但同時配合到for循環(huán)的話會出現(xiàn)不符合預(yù)期的運行結(jié)果,所以本文就來為大家講講如何避免這種情況的出現(xiàn)

一道面試題

for(var i = 0;i<5;i++){
    console.log(i)
}

那么以上會輸出什么呢?答案是控制臺是依次輸出0,1,2,3,4。相信大家小伙伴們都答對了。再接再厲吧,再來一道。

for(var i = 0;i<5;i++){
    setTimeout(function(){
        console.log(i)
    })
}

這次還會是同樣的結(jié)論嗎?答案是輸出5次5。這里開始有疑惑了對吧,預(yù)期輸出應(yīng)該也是0,1,2,4才對,怎么會輸出的是5呢?先開個結(jié)論,這里是和作用域有關(guān)系的。

引申

為了更進一步的去理解這個問題,來一個需求吧。用一個數(shù)組去存放函數(shù),依次輸出0-4之間的數(shù)吧。

var a = []
for (var i= 0;i<2;i++){
            a[i] =function(){
                    console.log(i)
            }
   }
a.forEach(_=>{
            _()
        })

答案同樣是只能輸出5。

原因就很簡單,因為你的每一個函數(shù)都綁定的變量i,所以每次去執(zhí)行函數(shù),都會去訪問這個變量i,因為var聲明的變量,并不只局限在for循環(huán)當(dāng)中,而是在全局當(dāng)中生效了!而你又不是在循環(huán)當(dāng)中去調(diào)用它的,而是在循環(huán)之后去調(diào)用。在循環(huán)時,i會伴隨著循環(huán)增長,此時你調(diào)用的話,前面的確實a[i]的結(jié)果是i,但a[i-1],a[i-2]...的結(jié)果也是i,因為函數(shù)調(diào)用時,內(nèi)部的i指向的是全局范圍內(nèi)的i。

換言之,你數(shù)組里的函數(shù)都是引用的這個全局變量i。而不是for循環(huán)里的局部變量i。

要想解決這個問題,請接著往下看。

解決思路

思路:既然var聲明的是全局的變量,那么只要函數(shù)里的變量是局部的即可。

寫法1

巧的是ES6當(dāng)中的let聲明關(guān)鍵字就是這個效果。

var a = []
for (let i= 0;i<2;i++){   //這里把原來的var聲明改成了let聲明
            a[i] =function(){
                    console.log(i)
            }
   }
a.forEach(_=>{
            _()
        })

那么可能會疑問,既然這個let聲明的i是局部變量,那么每次循環(huán)都會重新創(chuàng)建1個i吧?

是的沒錯。

那么每次都重新創(chuàng)建的話,會不會i的值也會被重新初始化呢?

答案是不會,JS引擎在for循環(huán)當(dāng)中會記住前一次結(jié)束時的i值,并且在下一次創(chuàng)建時將i賦值。

寫法2

var a = []
for (var i= 0;i<2;i++){   
            a[i] = (function(i){
                        return function(){
                            console.log(i)
            })(i)
   }
a.forEach(_=>{
            _()
        })

這里的寫法就是在每次循環(huán)當(dāng)中,將循環(huán)中的i(i在不斷增長),通過形參傳進去,從而誕生出局部變量i。

附:形參傳遞的過程,基本數(shù)據(jù)類型就是將值賦給形參,而引用數(shù)據(jù)類型則是將指針賦給形參。

當(dāng)心

可能會有這樣想法的同學(xué)。這樣做只是定義了函數(shù),這個函數(shù)有1個形參i而已。這樣你調(diào)用它就變成了a[i](xxx)。

var a = []
for (var i= 0;i<2;i++){   
            a[i] = function(i){
                            console.log(i)
            }
   }
a.forEach(_=>{
            _()
        })

想要傳遞參數(shù)只能是(fun(i){})(i),寫成立即執(zhí)行函數(shù)調(diào)用它,這樣才能去給它傳值(形參)。

var a = []
for (var i= 0;i<2;i++){   
            a[i] = (function(i){
                            console.log(i)
            })(i)
   }
a.forEach(_=>{
            _()
        })

而加入括號的時候,就會被執(zhí)行了,因此我們需要套一層return。這樣才能達(dá)到我們想要的效果

想要傳遞參數(shù)只能是(fun(i){})(i),寫成立即執(zhí)行函數(shù)調(diào)用它,這樣才能去給它傳值(形參)。

而加入括號的時候,就會被執(zhí)行了,因此我們需要套一層return。這樣才能達(dá)到我們想要的效果

到此這篇關(guān)于JavaScript新手必看之var在for循環(huán)中的坑的文章就介紹到這了,更多相關(guān)var for循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript實現(xiàn)淘寶京東6位數(shù)字支付密碼效果

    JavaScript實現(xiàn)淘寶京東6位數(shù)字支付密碼效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實現(xiàn)淘寶京東6位數(shù)字支付密碼效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • javascript深拷貝和淺拷貝詳解

    javascript深拷貝和淺拷貝詳解

    本文主要介紹了javascript深拷貝和淺拷貝的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 淺談JS函數(shù)定義方式的區(qū)別

    淺談JS函數(shù)定義方式的區(qū)別

    下面小編就為大家?guī)硪黄獪\談JS函數(shù)定義方式的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • JS簡單添加元素新節(jié)點的方法示例

    JS簡單添加元素新節(jié)點的方法示例

    這篇文章主要介紹了JS簡單添加元素新節(jié)點的方法,結(jié)合實例形式分析了javascript針對頁面元素節(jié)點的創(chuàng)建、添加、克隆等相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • 利用Promise自定義一個GET請求的函數(shù)示例代碼

    利用Promise自定義一個GET請求的函數(shù)示例代碼

    這篇文章主要給大家介紹了關(guān)于如何利用Promise自定義一個GET請求的函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Promise具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 解決Layui數(shù)據(jù)表格的寬高問題

    解決Layui數(shù)據(jù)表格的寬高問題

    今天小編就為大家分享一篇解決Layui數(shù)據(jù)表格的寬高問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 淺談javascript中執(zhí)行環(huán)境(作用域)與作用域鏈

    淺談javascript中執(zhí)行環(huán)境(作用域)與作用域鏈

    本文主要介紹了javascript中執(zhí)行環(huán)境(作用域)與作用域鏈,并在文章結(jié)尾處做出了總結(jié),感興趣的朋友可以看下
    2016-12-12
  • 微信小程序?qū)崿F(xiàn)打卡簽到頁面

    微信小程序?qū)崿F(xiàn)打卡簽到頁面

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)打卡簽到頁面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • js實現(xiàn)上傳按鈕并顯示縮略圖小輪子

    js實現(xiàn)上傳按鈕并顯示縮略圖小輪子

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)上傳按鈕并顯示縮略圖小輪子,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • javascript中attachEvent用法實例分析

    javascript中attachEvent用法實例分析

    這篇文章主要介紹了javascript中attachEvent用法,實例分析了javascript中事件綁定的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05

最新評論