Cet article vous apporte des connaissances pertinentes sur javascript, qui présente principalement les avantages de l'utilisation de let pour déclarer des variables. ES6 introduit non seulement le mot-clé let pour résoudre le problème de la déclaration de variable, mais introduit également la portée au niveau du bloc. regardez le concept ci-dessous. J’espère qu’il sera utile à tout le monde. 【Recommandations associées : Tutoriel vidéo javascript, front-end web】 Utiliser Let pour déclarer des variables ES6 introduit non seulement le mot-clé let pour résoudre le problème de déclaration de variable, En même temps, le concept de portée au niveau du bloc est introduit. let关键字用于解决变量声明的问题,同时引入了块级作用域的概念。 块级作用域: 代码执行时遇到花括号{会创建一个块级作用域、花括号}结束,销毁块级作用域。 let a = 123;//全局作用域定义 { let a = 456;//然后定义块级作用域 console.log(a)//使用的时块级作用域中的a } console.log(a)//使用的全局作用域中的a 有了块级作用域之后它的使用范围跟函数一样被限制在了里面 这样更符合常规语言的逻辑,几乎所有的语言都是这样的,但是因为JS以前有变量提升导致了以前很混乱 现在有了"let"之后有效的改善了这样的局面 全局变量挂载到全局对象:全局对象污染问题 let a = 123;console.log(a)//输出undefined 而用var声明赋值的话则会挂载到全局 仅仅是这么一个改动我们都无法拒绝使用Let 允许重复的变量声明:导致数据被覆盖的问题 let声明变量不允许当前作用域范围内重复声明 变量提升?:怪异数据访问闭包问题 使用let不会有变量提升,因此不能再定义let之前使用它 底层实现上,let声明的变量实际上也会有提升,但是,提升后会将其放入“暂时性死区”,如果访问的变量位于暂时性死区,则会报错Cannot access 'a' before initialization 当代码运行到该变量的声明语句时,会将其从暂时性死区中移除 在循环中let会做特殊处理 在循环中用let声明的循环变量,会特殊处理,每次进入循环体,都会开启一个新的作用域,并且将循环变量绑定到该作用域(每次循环使用的是一个全新的循环变量) 再循环中 使用let声明循环变量,再循环结束后会被销毁 //这时我绑定了10个按钮让咋们在点击时输出对应的ifor (let i = 1; i 使用let时就不会像var一样在同一个作用域下修改的同一个i了 具体见我写过的JS用var声明变量的不足,里面有详细提到输出时会有什么问题 在此时let会创建10个作用域看起来用的是同一个i但实际上使用的是不同的i Portée au niveau du bloc : Lorsque le code est exécuté et rencontre des accolades {, une portée au niveau du bloc sera créée, accolades >Fin, détruisez la portée au niveau du bloc. rrreeerrreeeLes variables globales sont montées sur des objets globaux : problème de pollution des objets globauxrrreeeSi vous utilisez var pour déclarer l'affectation, elle sera montée sur le global C'est un tel changement que nous ne pouvons pas refuser d'utiliser Let Autoriser les déclarations répétées de variables : un problème qui provoque l'écrasement des donnéeslet les variables déclarées n'autorisent pas les déclarations répétées dans le périmètre actuelPromotion de variable ? : Problème étrange de fermeture de l'accès aux données L'utilisation de let n'aura pas de promotion variable, elle ne peut donc pas être utilisée avant de définir let Dans en termes d'implémentation sous-jacente, les variables déclarées par let seront effectivement améliorées. Cependant, après la promotion, elles seront placées dans la "zone morte temporaire". , ce sera l'erreur Impossible d'accéder à 'a' avant l'initialisation Lorsque le code s'exécute vers l'instruction de déclaration de la variable, elle sera supprimée de la zone morte temporairedans la boucle let sera traité spécialement Les variables de boucle déclarées avec let dans la boucle seront traitées spécialement. Chaque fois que vous entrez dans le corps de la boucle, une nouvelle portée. sera ouvert. et liera la variable de boucle à la portée (chaque boucle utilise une toute nouvelle variable de boucle) Utilisez let pour déclarer la variable de boucle dans la boucle, et ce sera Destroy rrreee Lors de l'utilisation de let, le même i ne sera pas modifié dans la même portée que var Voir ce que j'ai écrit pour plus de détails Les lacunes de L'utilisation de var pour déclarer des variables dans JS a été mentionnée en détail. Quels problèmes surviendront lors de la sortie ? À ce stade, let créera 10 étendues qui semblent utiliser la même portée icode> mais utilise en fait un i différent. L'exemple est le suivant : Pourquoi devrions-nous utiliser let pour remplacer var ? Étant donné que var n'a pas de restrictions de portée au niveau du bloc, il est facile de provoquer une pollution variable. Jetons un coup d'œil à certains des problèmes qui pourraient survenir lorsqu'il n'y avait pas de portée au niveau du bloc avant l'apparition de let. 1. Portée variable 2. Si nous bloquons la portée au niveau du bloc Et si nous faisions cela dans la scène ? 🎜🎜🎜🎜🎜🎜Pourquoi ça ? Nous avons uniquement modifié le nom en dehors du bloc d'instruction if, mais cela a affecté la sortie de l'intégralité de l'instruction if. 🎜🎜🎜3. Pour un bloc sans portée au niveau du bloc🎜🎜🎜🎜🎜🎜🎜🎜🎜Nous pouvons voir que quel que soit le bouton sur lequel nous cliquons, le résultat est que le cinquième bouton est cliqué. Pourquoi est-ce ? Parce que cela est lié à notre utilisation de la définition var dans le corps de la boucle. 🎜🎜Avant qu'il n'y ait une portée au niveau du bloc, nous avons résolu cet embarras grâce aux fermetures, car les fermetures ont leur propre portée de fonction. 🎜🎜🎜🎜🎜🎜🎜Après avoir utilisé let, il suffit d'apporter une légère modification, en changeant la variable dans le corps de la boucle en let, pour éviter d'utiliser la syntaxe difficile de fermeture. Le principe de mise en œuvre de let in the loop body : Vous vous demandez peut-être comment c'était avant d'utiliser var ? Avant ES5, parce que si et pour nous n'avions pas le concept de portée au niveau du bloc, dans de nombreux scénarios d'application spécifiques, nous devions utiliser la portée de la fonction pour résoudre le problème de l'utilisation de variables externes. Dans la famille ES6, let et (const) ont été ajoutés, donnant aux instructions if et for l'existence d'une portée au niveau du bloc (la var d'origine n'avait pas le concept de portée au niveau du bloc). L'émergence de let, à travers les exemples ci-dessus, peut être considérée comme ayant compensé les lacunes existantes de var. Nous pouvons considérer let comme une var parfaite, ou comme une modification, une mise à niveau et une optimisation de var. 【Recommandations associées : tutoriel vidéo javascript, front-end web】