Pourquoi la portée du bloc n'a-t-elle pas été implémentée dans JavaScript?

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:

  • Déclaration de bloc

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.

  • Une solution de contournement

Nous pouvons intégrer artificiellement les étendues en créant de nouvelles fonctions et en les invoquant immédiatement

  • ECMAScript 2015 (ES6)

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:

  1. Cela rend la langue plus facile à mettre en œuvre. JavaScript a été initialement conçu comme une langue pour écrire des applications Web interactives. Par conséquent, il devait être petit et facile à mettre en œuvre.
  2. Les étendues de blocs introduisent un succès de performance sur des langages dynamiques comme JavaScript. C'est parce que lorsque vous essayez d'accéder à une variable qui n'est pas dans la portée actuelle, JavaScript vérifie d'abord la portée actuelle, puis la portée parentale et ainsi de suite jusqu'à ce qu'elle trouve la variable ou atteint la fin. Par conséquent, l'introduction d'étendues de blocs rendrait l'accès variable dans les boucles et les boucles imbriquées très lentement.
  3. Le manque d'étendue de blocs facilite l'écriture de programmes. Par exemple, dites que vous souhaitez créer une variable uniquement si une certaine condition est vraie. Tout ce que vous devez faire dans JavaScript est de déclarer et de définir la variable dans une déclaration 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 .
  4. L'absence d'étendue de bloc permet de repérer les déclarations. Ceci est particulièrement utile dans le cas des déclarations de fonction. Par exemple, voir cette violon: http://jsfiddle.net/L6SgM/ (notez cependant que cet exemple ne fonctionne pas dans Firefox).
  5. Étant donné que JavaScript prend en charge les expressions de fonctions de première classe, nous n'avons pas besoin d'étendues de blocs. Ils peuvent être simulés en utilisant des expressions de fonctions appelées immédiatement .

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.