javascript - Comment comprendre "la partie instruction de boucle est une portée parent et l'intérieur du corps de la boucle est une portée enfant distincte"?
PHPz
PHPz 2017-05-18 10:52:55
0
5
469

如题。

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';

}

PHPz
PHPz

学习是最好的投资!

répondre à tous(5)
我想大声告诉你

Tout d'abord, vous avez var i à l'intérieur de for, ils sont dans la même portée, car var est une fonction Scope. i = 'abc';i++, alors i devient NaN. Comparer NaN avec des nombres, quelle que soit la comparaison, est faux. 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代码块里有效。所以执行了三次。

第三个问题,你在console.log之后定义了let i,所以i

Deuxièmement, let est une portée au niveau du bloc, donc i défini dans for (let i = 0; ...) code> n'est valide qu'entre parenthèses de for et n'a aucun effet dans un bloc, donc let i = 'abc' équivaut à redéfinir une variable, qui est for ne sont valides que dans le bloc de code for. Il a donc été exécuté trois fois. #🎜🎜# #🎜🎜#La troisième question est que vous avez défini let i après console.log, donc i 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.

Peter_Zhu

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 :

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

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 i = 'abc'

let est la portée au niveau du bloc. Chaque fois que la boucle for redéfinit un i, la portée de 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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal