Pourquoi cet extrait de code donne l'erreur "Uncaught ReferenceError : x is not Defined" dans la console
<body> <script> console.log(x); </script> <script> var x = 10; </script> </body>
Et ce disque est "indéfini" ?
<body> <script> console.log(x); var x = 10; </script> </body>
J'essaie de comprendre la déclaration des variables et la portée des variables. Et attendez-vous à ce que le boosting se produise puisque tout le code se trouve sur la même page. Mais comme console.log() est séparé dans une autre balise de script, j'obtiens une erreur au lieu de simplement enregistrer « non défini » sur la console.
var
被提升,这意味着它可以在定义它的范围的开头访问,即使声明行可能位于范围的末尾。如果您在声明之前访问该 var,则它是未定义
car il vous reste à effectuer la déclaration et éventuellement initialiser la variable à une valeur précise. C'est ainsi que fonctionne votre deuxième exemple.En savoir plus sur le boosting ici :
https://developer.mozilla.org/en-US/docs/glossary/lifting
Mais dans le premier exemple 2
有 2 个不同的作用域,因此第一个脚本中基本上不存在 var ,因此错误not Defined
.Découvrez
var
et sa portée ici :https://developer.mozilla.org /en-US/docs/Web/JavaScript/Reference/Statements/var
Important Je déconseille fortement d'utiliser
en production, utilisez simplement esbuild pour rétrograder votre code vers l'ancienne version appropriée de JS.var
。请改用const
和let
。使用 var 进行提升会导致错误,有时很难调试和修复。如果您需要在生产中仅使用var
. Veuillez utiliserconst
etlet
à la place. L'utilisation de var à des fins de promotion peut entraîner des erreurs parfois difficiles à déboguer et à corriger. Si vous devez utiliser uniquementconst
和let
也有点被提升,但是在提升状态下访问它们会导致运行时错误(这称为暂时的死区),这就是为什么它们更安全,因为您会立即收到错误,而不是静默地提升var
Fait intéressant,const
etlet
sont également quelque peu promus, mais y accéder dans l'état élevé provoque une erreur d'exécution (c'est ce qu'on appelle une zone morte temporaire ), c'est pourquoi ils sont plus sûrs car vous obtenez l'erreur immédiatement au lieu de la générer silencieusementhttps://developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Statements/let#temporal_dead_zone_tdz