web-dev-qa-db-fra.com

Pourquoi la portée du bloc n'a-t-elle pas été implémentée à l'origine en JavaScript?

J'ai lu et découvert par 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, pouvez-vous m'expliquer quelle est cette raison?

J'ai regardé autour de Google et ici, mais les articles que j'ai trouvés réitèrent simplement que JS a une portée de fonction et non une portée de bloc, sans expliquer pourquoi. Je suis curieux de savoir pourquoi c'est effectivement le cas.

69
mricci

Conversion de mon commentaire en réponse

Choix du créateur: j'ai tweeté Brendan et j'ai obtenu le réponse suivante :

@mplungjan 10 jours n'ont pas laissé de temps pour l'étendue du bloc. De nombreux "langages de script" de cette ère du milieu des années 90 avaient également peu d'étendues et se sont développés plus tard.


Cela dit, voici quelques points pertinents:

Important: JavaScript avant ECMAScript2015 (6e édition) n'a pas de portée de bloc. Les variables introduites dans un bloc sont étendues à la fonction ou au script conteneur, et les effets de leur définition persistent au-delà du bloc lui-même. En d'autres termes, les instructions de bloc n'introduisent pas de portée. Bien que les blocs "autonomes" soient une syntaxe valide, vous ne voulez pas utiliser de blocs autonomes en JavaScript, car ils ne font pas ce que vous pensez qu'ils font, si vous pensez qu'ils font quelque chose comme de tels blocs en C ou Java.

nous pouvons introduire artificiellement des étendues en créant de nouvelles fonctions et en les invoquant immédiatement

let et const les variables déclarées sont hissées mais elles ne sont pas initialisées à undefined dans le même comme var l'est. Par conséquent, référencer une variable déclarée let ou const avant que sa valeur ne soit affectée déclenche une ReferenceError.

La redéclaration de la même variable dans la même portée de bloc déclenche une SyntaxError.

112
mplungjan

Nouvelle réponse à partir de 2015. ES6 a une portée de bloc pour les définitions de variables avec les mots clés let et const.

15
jfriend00

Il y a plusieurs raisons, mais certaines qui me viennent à l'esprit sont d'aider à analyser/déboguer du code qui utilise des littéraux d'objet (qui peuvent parfois ressembler à un bloc), et de simplifier le garbage collection des variables locales.

J'espère que le support promis (discuté ici, par exemple, http://esdiscuss.org/notes/2012-07-25 ) s'avère réel car il serait très pratique d'utiliser des variables comme i qui étaient locaux à une seule boucle.

0
Joseph Myers