javascript - 怎麼理解「迴圈語句部分是一個父作用域,而迴圈體內部是一個單獨的子作用域」?
PHPz
PHPz 2017-05-18 10:52:55
0
5
466

如題。

雷雷 雷雷

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

雷雷

}

PHPz
PHPz

学习是最好的投资!

全部回覆(5)
我想大声告诉你

第一個,你在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 的塊級作用域裡面,就不會改變了。

Peter_Zhu

使用var宣告的時候
for(var i=0; i這樣看就比較明顯了
第一段程式碼循環一次是因為:

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

第二段程式碼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 可以看做夾在循環體和循環外的一個中間層,所以不受影響。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板