如題。
for (令 i = 0; i < 3; i ) {
}
学习是最好的投资!
第一個,你在for里面var i,它们是在同一个作用域的,因为var是一个函数作用域。i = 'abc';i++,这样i就变成NaN了。NaN和数字比较,无论是什么比较,都为false。所以,只輸出一次。
for
var i
var
i = 'abc';i++
i
NaN
false
第二個,let是块级作用域,所以在for (let i = 0; ...)定义的i只在for的括号里有效,在块内是没有效果的,所以let i = 'abc'是相当于重新定义了一个变量,是for代码块的块级作用域的变量,只在for程式碼區塊裡有效。所以執行了三次。
let
for (let i = 0; ...)
let i = 'abc'
第三個問題,你在console.log之后定义了let i,所以i在你調用的時候並沒有定義哈。參見上面一條。
console.log
let i
因為變數提升
第一個裡面外層的 i 被改變成為 'abc' 所以直接退出,而第二個裡面 'abc' 被限制在 for 的塊級作用域裡面,就不會改變了。
使用var宣告的時候 for(var i=0; i這樣看就比較明顯了第一段程式碼循環一次是因為:
你在内部将i赋值为字符串,无法进行++操作,for循环只运行了一次就结束了。
第二段程式碼let 宣告的變數只在起所在的區塊層級作用於中生效,上數程式碼中()、{}是兩個區塊層級作用域,他們之間互不影響,定義{}內的i並不會影響()內聲明的i
var是函數作用域。第二次迴圈判斷時i = 'abc'; , 而'abc'++ < 3為false,所以第一個for迴圈只執行了一次。
i = 'abc';
'abc'++ < 3
let是塊級作用域。每次for循環都重新定義了一個i,let i = 'abc'作用域在循環體內,不會影響循環體。
參考這裡: http://www.ecma-international...
for 的第一部分是 var (VariableDeclarationList)的時候,宣告的變數會合併到這個函數作用域裡,就像單獨宣告一樣。
for 的第一部分是 let 的時候,循環會分成 oldEnv 和 loopEnv ,其中 loopEnv 可以看做夾在循環體和循環外的一個中間層,所以不受影響。
第一個,你在
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
在你調用的時候並沒有定義哈。參見上面一條。因為變數提升
第一個裡面外層的 i 被改變成為 'abc' 所以直接退出,而第二個裡面 'abc' 被限制在 for 的塊級作用域裡面,就不會改變了。
使用var宣告的時候
for(var i=0; i這樣看就比較明顯了
第一段程式碼循環一次是因為:
第二段程式碼let 宣告的變數只在起所在的區塊層級作用於中生效,上數程式碼中()、{}是兩個區塊層級作用域,他們之間互不影響,定義{}內的i並不會影響()內聲明的i
var是函數作用域。第二次迴圈判斷時
i = 'abc';
, 而'abc'++ < 3
為false,所以第一個for迴圈只執行了一次。let是塊級作用域。每次for循環都重新定義了一個i,
let i = 'abc'
作用域在循環體內,不會影響循環體。參考這裡: http://www.ecma-international...
for 的第一部分是 var (VariableDeclarationList)的時候,宣告的變數會合併到這個函數作用域裡,就像單獨宣告一樣。
for 的第一部分是 let 的時候,循環會分成 oldEnv 和 loopEnv ,其中 loopEnv 可以看做夾在循環體和循環外的一個中間層,所以不受影響。