搜尋

首頁  >  問答  >  主體

javascript - 怎麼理解「迴圈語句部分是一個父作用域,而迴圈體內部是一個單獨的子作用域」?

如題。

雷雷 雷雷

for (令 i = 0; i < 3; i ) {

雷雷

}

PHPzPHPz2844 天前467

全部回覆(5)我來回復

  • 我想大声告诉你

    我想大声告诉你2017-05-18 10:54:55

    第一個,你在for里面var i,它们是在同一个作用域的,因为var是一个函数作用域。i = 'abc';i++,这样i就变成NaN了。NaN和数字比较,无论是什么比较,都为false。所以,只輸出一次。

    第二個,let是块级作用域,所以在for (let i = 0; ...)定义的i只在for的括号里有效,在块内是没有效果的,所以let i = 'abc'是相当于重新定义了一个变量,是for代码块的块级作用域的变量,只在for程式碼區塊裡有效。所以執行了三次。

    第三個問題,你在console.log之后定义了let i,所以i在你調用的時候並沒有定義哈。參見上面一條。

    回覆
    0
  • 迷茫

    迷茫2017-05-18 10:54:55

    因為變數提升

    第一個裡面外層的 i 被改變成為 'abc' 所以直接退出,而第二個裡面 'abc' 被限制在 for 的塊級作用域裡面,就不會改變了。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-05-18 10:54:55

    使用var宣告的時候
    for(var i=0; i<3; i++){} 等價於 var i;for(i=0;i<3;i++){}。
    這樣看就比較明顯了
    第一段程式碼循環一次是因為:

    你在内部将i赋值为字符串,无法进行++操作,for循环只运行了一次就结束了。

    第二段程式碼let 宣告的變數只在起所在的區塊層級作用於中生效,上數程式碼中()、{}是兩個區塊層級作用域,他們之間互不影響,定義{}內的i並不會影響()內聲明的i

    回覆
    0
  • 世界只因有你

    世界只因有你2017-05-18 10:54:55

    var是函數作用域。第二次迴圈判斷時i = 'abc'; , 而'abc'++ < 3為false,所以第一個for迴圈只執行了一次。

    let是塊級作用域。每次for循環都重新定義了一個i,let i = 'abc'作用域在循環體內,不會影響循環體。

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-18 10:54:55

    參考這裡: http://www.ecma-international...

    for 的第一部分是 var (VariableDeclarationList)的時候,宣告的變數會合併到這個函數作用域裡,就像單獨宣告一樣。

    for 的第一部分是 let 的時候,循環會分成 oldEnv 和 loopEnv ,其中 loopEnv 可以看做夾在循環體和循環外的一個中間層,所以不受影響。

    回覆
    0
  • 取消回覆