そうです。
リーリー リーリーfor (i = 0; i < 3; i ) {
リーリー}
我想大声告诉你2017-05-18 10:54:55
まず、あなたはここにいますfor
里面var i
,它们是在同一个作用域的,因为var
是一个函数作用域。i = 'abc';i++
,这样i
就变成NaN
了。NaN
和数字比较,无论是什么比较,都为false
。したがって、出力は 1 回だけです。
2 番目のものは let
是块级作用域,所以在for (let i = 0; ...)
定义的i
只在for
的括号里有效,在块内是没有效果的,所以let i = 'abc'
是相当于重新定义了一个变量,是for
代码块的块级作用域的变量,只在for
コード ブロックで有効です。したがって、それは3回実行されました。
3 番目の質問は、console.log
之后定义了let i
,所以i
呼び出し時に定義しませんでした。上記の項目を参照してください。
迷茫2017-05-18 10:54:55
変数が改善されたからです
最初のものでは、外側の i が 'abc' に変更されるため、直接終了しますが、2 つ目では、'abc' は for のブロックレベルのスコープに制限されており、変更されません。
天蓬老师2017-05-18 10:54:55
var 宣言を使用する場合
for(var i=0; i<3; i++){} は var i;for(i=0;i<3;i++){} と同等です。
こうして見ると、より明白です
コードの最初の部分は、次の理由で 1 回ループします:
コードの 2 番目の部分で let によって宣言された変数は、それらが配置されているブロックレベルのスコープでのみ有効になります。これらは、相互に影響しません。 {} i 内の定義は、() で宣言された i には影響しません
世界只因有你2017-05-18 10:54:55
var は関数のスコープです。 2回目のループ判定ではi = 'abc';
, 而'abc'++ < 3
が偽となるため、1回目のforループは1回だけ実行されます。
let はブロックレベルのスコープです。 for ループが i を再定義するたびに、let i = 'abc'
のスコープはループ本体内にあり、ループ本体には影響しません。
曾经蜡笔没有小新2017-05-18 10:54:55
ここを参照: http://www.ecma-international...
for の最初の部分が var (VariableDeclarationList) の場合、宣言された変数は、個別に宣言されたのと同じように、関数のスコープにマージされます。
forの最初の部分をletするとループはoldEnvとloopEnvに分割されますが、loopEnvはループ本体とループの外側に挟まれた中間層とみなせるので影響を受けません。