J'ai lu, et j'ai découvert à travers ma propre expérience, que JavaScript n'a pas de portée de bloc. En supposant que la langue a été conçue de cette façon pour une raison, quelle est cette raison?
J'ai examiné Google et ici, mais les publications que j'ai trouvées réitèrent que JS a une portée de fonction et ne bloque pas la portée, sans expliquer pourquoi. Je suis curieux de savoir pourquoi c'est vraiment le cas.
Conversion de mon commentaire en réponse
Choix du créateur: j'ai tweeté à Brendan et j'ai obtenu la réponse suivante :
@mplungjan 10 jours n'a pas laissé de temps pour la portée du bloc. En outre, de nombreuses «langues de script» de cette époque des années 90 avaient peu d'étendues et se sont développées plus tard.
Cela dit, voici quelques points pertinents:
Important: JavaScript n'a pas de portée de bloc. Les variables introduites dans un bloc sont regroupées dans la fonction ou le script contenant, et les effets de leur mise en place persistent au-delà du bloc lui-même. En d'autres termes, les instructions de bloc ne présentent pas de portée. Bien que les blocs "autonomes" soient une syntaxe valide, vous ne souhaitez pas utiliser de blocs autonomes en JavaScript, car ils ne font pas ce que vous pensez qu'ils le font, si vous pensez qu'ils font quelque chose comme ces blocs en C ou Java.
Nous pouvons intégrer artificiellement les étendues en créant de nouvelles fonctions et en les invoquant immédiatement
let
variables déclarées ne sont pas hissées au début du bloc enveloppant. Par conséquent, référencer une variable let
déclaré avant que sa valeur ne soit attribuée pour générer un ReferenceError.
Redeclaration de la même variable dans la même portée de bloc augmente un SyntaxError.
La portée du bloc n'a pas été implémentée pour les raisons suivantes:
if
. Dans des langages comme C, vous devriez déclarer la variable en dehors de l'instruction if
et la définir dans l'instruction if
. Nouvelle réponse à partir de 2015. ES6 a une portée de blocage pour les définitions de variables avec le mot let
clé let
.
Il y a plusieurs raisons, mais certaines qui viennent à l'esprit sont d'aider à analyser / déboguer le code qui utilise des objets littéraires (qui peuvent parfois ressembler à un bloc), et de simplifier la collecte de déchets des variables locales.
J'espère que le soutien promis (discuté ici, par exemple, http://esdiscuss.org/notes/2012-07-25 ) s'avère être réel car il serait très pratique d'utiliser des variables comme i
qui étaient locales uniquement Une seule boucle.