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 } }
以上代碼產生了一個表面上看起來會很詭異的問題,就是若是kind!=4的分支2狀況下,有時候會致使外層的for循環回頭,即:明明最外層已經循環到child的最後一個了,跑完分支2以後,外層for循環又回頭執行。函數
緣由分析:
我想專業人士不像我這麼渣的話會發現問題在變量i,此處i並不會成爲塊級變量,而是函數級,分支2中的i變化會致使外層i變化,從而致使循環回頭。
js在ES6以前沒有塊級做用域,只分爲全局做用域和函數級做用域,此處i爲函數級做用域,而咱們用它作循環索引的時候實際上是想看成塊級做用域使用。code
解決辦法索引
想要達到塊級做用域效果能夠使用ES6語法的let關鍵字實現:作用域
for(let i=0;i<arr.length;i++){ }
或者只針對解決上述問題,沒必要糾結做用域問題的話,我用了更low一些但能夠解決問題的,那就是分支2就不用i,換成j同樣可行。for循環