如题。
for (var i = 0; i < 3; i++) {
var i = 'abc';
console.log(i);
}
//为什么这里只输出一次 abc ? 是因为'abc'++ <3 是false吗?
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}//为什么是3次 abc?
untuk (biar i = 0; i < 3; i++) {
console.log(i) //这里报ReferenceError: i is not define?是因为暂时性死区?
let i = 'abc';
}
Pertama, anda mempunyaipalsu. Jadi, keluarkan sekali sahaja.
var i
di dalamfor
, ia berada dalam skop yang sama, keranavar
ialah Skop fungsi.i = 'abc';i++
, kemudiani
menjadiNaN
. MembandingkanNaN
dengan nombor, tidak kira apa perbandingannya, adalahfor
里面var i
,它们是在同一个作用域的,因为var
是一个函数作用域。i = 'abc';i++
,这样i
就变成NaN
了。NaN
和数字比较,无论是什么比较,都为false
。所以,只输出一次。第二个,
let
是块级作用域,所以在for (let i = 0; ...)
定义的i
只在for
的括号里有效,在块内是没有效果的,所以let i = 'abc'
是相当于重新定义了一个变量,是for
代码块的块级作用域的变量,只在for
代码块里有效。所以执行了三次。第三个问题,你在
Kedua,console.log
之后定义了let i
,所以i
let
ialah skop peringkat blok, jadii
ditakrifkan dalamfor (let i = 0; ...)
code> hanya sah dalam kurunganfor
dan tidak mempunyai kesan dalam blok, jadilet i = 'abc'
adalah bersamaan dengan mentakrifkan semula pembolehubah, iaitu untuk blok kod hanya sah dalam blok kodfor
. Jadi ia dilaksanakan tiga kali. #🎜🎜# #🎜🎜#Soalan ketiga ialah anda mentakrifkanbiarkan i
selepasconsole.log
, jadii
tidak wujud apabila anda memanggilnya ha. Lihat item di atas. #🎜🎜#Kerana pembolehubah diperbaiki
Dalam yang pertama, i luar ditukar kepada 'abc', jadi ia keluar terus, manakala dalam yang kedua, 'abc' dihadkan kepada skop peringkat blok untuk dan tidak akan berubah.
Apabila menggunakan pengisytiharan var
for(var i=0; i<3; i++){} adalah bersamaan dengan var i;for(i=0;i<3;i++){}.
Lebih jelas jika anda melihatnya dengan cara ini
Sekeping kod pertama digelung sekali kerana:
Pembolehubah yang diisytiharkan dengan membiarkan dalam sekeping kod kedua hanya berkuat kuasa dalam skop peringkat blok di mana ia berada Dalam kod di atas, () dan {} ialah dua skop peringkat blok satu sama lain. Definisi { i dalam } tidak akan menjejaskan i yang diisytiharkan di dalam ()
var ialah skop fungsi. Dalam penghakiman gelung kedua,
i = 'abc';
, dan'abc'++ < 3
adalah palsu, jadi gelung pertama untuk hanya dilaksanakan sekali .i = 'abc';
, 而'abc'++ < 3
为false,所以第一个for循环只执行了一次。let是块级作用域。每次for循环都重新定义了一个i,
let adalah skop peringkat blok. Setiap kali gelung for mentakrifkan semula i, skoplet i = 'abc'
let i = 'abc'
berada dalam badan gelung dan tidak akan menjejaskan badan gelung. 🎜Rujukan di sini: http://www.ecma-international...
Apabila bahagian pertama bagi ialah var (VariableDeclarationList), pembolehubah yang diisytiharkan akan digabungkan ke dalam skop fungsi, sama seperti ia diisytiharkan secara berasingan.
Apabila bahagian pertama for dibiarkan, gelung akan dibahagikan kepada oldEnv dan loopEnv loopEnv boleh dianggap sebagai lapisan perantaraan yang diapit di antara badan gelung dan bahagian luar gelung, jadi ia tidak terjejas.