如题。
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?
pour (soit i = 0; i < 3; i++) {
console.log(i) //这里报ReferenceError: i is not define?是因为暂时性死区?
let i = 'abc';
}
Tout d'abord, vous avez
var i
à l'intérieur defor
, ils sont dans la même portée, carvar
est une fonction Scope.i = 'abc';i++
, alorsi
devientNaN
. ComparerNaN
avec des nombres, quelle que soit la comparaison, estfaux
. Donc, ne sortez qu’une seule fois.for
里面var i
,它们是在同一个作用域的,因为var
是一个函数作用域。i = 'abc';i++
,这样i
就变成NaN
了。NaN
和数字比较,无论是什么比较,都为false
。所以,只输出一次。第二个,
let
是块级作用域,所以在for (let i = 0; ...)
定义的i
只在for
的括号里有效,在块内是没有效果的,所以let i = 'abc'
是相当于重新定义了一个变量,是for
代码块的块级作用域的变量,只在for
代码块里有效。所以执行了三次。第三个问题,你在
Deuxièmement,console.log
之后定义了let i
,所以i
let
est une portée au niveau du bloc, donci
défini dansfor (let i = 0; ...)
code> n'est valide qu'entre parenthèses defor
et n'a aucun effet dans un bloc, donclet i = 'abc'
équivaut à redéfinir une variable, qui est for ne sont valides que dans le bloc de codefor
. Il a donc été exécuté trois fois. #🎜🎜# #🎜🎜#La troisième question est que vous avez définilet i
aprèsconsole.log
, donci
n'existait pas lorsque vous l'avez appelé Définition. Ha. Voir l'élément ci-dessus. #🎜🎜#Parce que les variables sont améliorées
Dans le premier, le i externe est remplacé par « abc », il sort donc directement, tandis que dans le second, « abc » est limité à la portée au niveau du bloc de for et ne changera pas.
Lors de l'utilisation de la déclaration var
for(var i=0; i<3; i++){} est équivalent à var i;for(i=0;i<3;i++){}.
C'est plus évident quand on le regarde de cette façon
Le premier morceau de code boucle une fois parce que :
Les variables déclarées par let dans le deuxième morceau de code ne prennent effet que dans la portée au niveau du bloc où elles se trouvent. Dans le code ci-dessus, () et {} sont deux portées au niveau du bloc. Elles ne s'affectent pas. La définition dans {} i n'affectera pas le i déclaré dans ()
var est la portée de la fonction. Dans le deuxième jugement de boucle,
i = 'abc';
et'abc'++ < 3
est faux, donc la première boucle for n'est exécutée qu'une seule fois.i = 'abc';
, 而'abc'++ < 3
为false,所以第一个for循环只执行了一次。let是块级作用域。每次for循环都重新定义了一个i,
let est la portée au niveau du bloc. Chaque fois que la boucle for redéfinit un i, la portée delet i = 'abc'
let i = 'abc'
est dans le corps de la boucle et n'affectera pas le corps de la boucle. 🎜Référence ici : http://www.ecma-international...
Lorsque la première partie de for est var (VariableDeclarationList), les variables déclarées seront fusionnées dans la portée de la fonction, tout comme elles ont été déclarées séparément.
Lorsque la première partie de for est laissée, la boucle sera divisée en oldEnv et loopEnv peut être considérée comme une couche intermédiaire prise en sandwich entre le corps de la boucle et l'extérieur de la boucle, elle n'est donc pas affectée.