成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從一個詭異的bug發(fā)現(xiàn)js變量作用域問題

VishKozus / 3040人閱讀

摘要:分支分支以上代碼產(chǎn)生了一個表面上看起來會很詭異的問題,就是如果的分支情況下,有時候會導(dǎo)致外層的循環(huán)回頭,即明明最外層已經(jīng)循環(huán)到的最后一個了,跑完分支之后,外層循環(huán)又回頭執(zhí)行。

for (var i = 0; child && i < child.length; i++) {
            var obj = child[i];
            var kind = child[i].kind;
            var deiveId = child[i].id;
            if (kind == "4") {//分支1
                 // do sometjing
            }else{//分支2
                for(i in arr){
                   //do something
                }
            }

以上代碼產(chǎn)生了一個表面上看起來會很詭異的問題,就是如果kind!=4的分支2情況下,有時候會導(dǎo)致外層的for循環(huán)回頭,即:明明最外層已經(jīng)循環(huán)到child的最后一個了,跑完分支2之后,外層for循環(huán)又回頭執(zhí)行。

原因分析:
我想專業(yè)人士不像我這么渣的話會發(fā)現(xiàn)問題在變量i,此處i并不會成為塊級變量,而是函數(shù)級,分支2中的i變化會導(dǎo)致外層i變化,從而導(dǎo)致循環(huán)回頭。
js在ES6之前沒有塊級作用域,只分為全局作用域和函數(shù)級作用域,此處i為函數(shù)級作用域,而我們用它做循環(huán)索引的時候其實是想當(dāng)作塊級作用域使用。

解決辦法

想要達(dá)到塊級作用域效果可以使用ES6語法的let關(guān)鍵字實現(xiàn):

for(let i=0;i

或者只針對解決上述問題,不必糾結(jié)作用域問題的話,我用了更low一些但可以解決問題的,那就是分支2就不用i,換成j一樣可行。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95199.html

相關(guān)文章

  • 前端_JavaScript

    摘要:為此決定自研一個富文本編輯器。例如當(dāng)要轉(zhuǎn)化的對象有環(huán)存在時子節(jié)點屬性賦值了父節(jié)點的引用,為了關(guān)于函數(shù)式編程的思考作者李英杰,美團(tuán)金融前端團(tuán)隊成員。只有正確使用作用域,才能使用優(yōu)秀的設(shè)計模式,幫助你規(guī)避副作用。 JavaScript 專題之惰性函數(shù) JavaScript 專題系列第十五篇,講解惰性函數(shù) 需求 我們現(xiàn)在需要寫一個 foo 函數(shù),這個函數(shù)返回首次調(diào)用時的 Date 對象,注意...

    Benedict Evans 評論0 收藏0
  • 前端編碼規(guī)范

    摘要:去掉無用的代碼使用主動語態(tài)避免一連串松散結(jié)構(gòu)的代碼邏輯把相關(guān)的變量函數(shù)放在一起。該處代碼運行正常,但可能由于時間趕或者其他原因,需要修正。此時需要對思路或詭異手段進(jìn)行描述。 命名規(guī)范 變量名, 函數(shù)名 小駝峰【命名法 camel Case】: numberOfPeople 第一個單詞的首字母小寫;第二個單詞開始每個單詞的的首字母大寫 組件名 大駝峰【命名法 Camel Case】: ...

    YJNldm 評論0 收藏0
  • PHP 一個詭異加法算法研究

    摘要:然而實際上,這個結(jié)果反而是正確的。結(jié)論我認(rèn)為出現(xiàn)這種詭異的結(jié)果應(yīng)該算是的,同時,這也說明了此種問題不太容易被發(fā)現(xiàn)和暴露,這要求我們平常寫代碼的時候盡量使用常用的語法,和精干的語句,讓代碼和邏輯達(dá)到最佳的平衡點。 前言 之前我在面試的時候,遇到許多年輕人都聲稱自己精通php,有過許多項目經(jīng)驗等等。然而,當(dāng)真正筆試的時候,我問到 $result=1; if(-1){ $result=2;...

    gekylin 評論0 收藏0
  • vue總結(jié)系列--組件化

    摘要:觸發(fā)事件可以攜帶數(shù)據(jù),這些數(shù)據(jù)被用于傳遞給綁定了事件的其它組件的回調(diào)函數(shù)上,進(jìn)而被傳遞給其它組件。父組件可以在回調(diào)函數(shù)里做任何事情,頗有靈活性。一般情況下,父組件會在回調(diào)函數(shù)中更新自己的狀態(tài)數(shù)據(jù)。 上一篇博文梳理了vue的數(shù)據(jù)驅(qū)動和響應(yīng)式相關(guān)的特性,這一篇博文就來梳理vue的一個很重要的特性,組件化。自定義組件之于vue,其意義不亞于函數(shù)之于C,java之類的編程語言。函數(shù)是計算機科學(xué)...

    cuieney 評論0 收藏0
  • js作用和this理解

    摘要:總結(jié)總而言之,作用域在語法分析時就已經(jīng)處理完啦,的作用域是靜態(tài)作用域,在運行時只是上下文對象在一直發(fā)生變化。 JavaScript 的作用域和上下文對象this 從幾個有意思的js問題開始 為什么輸出的不是f2? `var scope = top; var f1 = function() { console.log(scope); }; f1(); //...

    李文鵬 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<