如題。
雷雷 雷雷for (令 i = 0; i < 3; i ) {
雷雷}
我想大声告诉你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
在你調用的時候並沒有定義哈。參見上面一條。
迷茫2017-05-18 10:54:55
因為變數提升
第一個裡面外層的 i 被改變成為 'abc' 所以直接退出,而第二個裡面 'abc' 被限制在 for 的塊級作用域裡面,就不會改變了。
天蓬老师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
世界只因有你2017-05-18 10:54:55
var是函數作用域。第二次迴圈判斷時i = 'abc';
, 而'abc'++ < 3
為false,所以第一個for迴圈只執行了一次。
let是塊級作用域。每次for循環都重新定義了一個i,let i = 'abc'
作用域在循環體內,不會影響循環體。
曾经蜡笔没有小新2017-05-18 10:54:55
參考這裡: http://www.ecma-international...
for 的第一部分是 var (VariableDeclarationList)的時候,宣告的變數會合併到這個函數作用域裡,就像單獨宣告一樣。
for 的第一部分是 let 的時候,循環會分成 oldEnv 和 loopEnv ,其中 loopEnv 可以看做夾在循環體和循環外的一個中間層,所以不受影響。