Pourquoi le nom «let» a-t-il été choisi pour les déclarations de variables de portée bloc en JavaScript?

306

Je comprends pourquoi varprend ce nom - il est variable, const- c'est une constante, mais quelle est la signification derrière le nom let, qui s'étend au bloc actuel? Laisse faire?

Vitaly Zdanevich
la source
7
BASIC , inventé en 1962, utilisé LET. Il pourrait y avoir des exemples de langues antérieures.
David R Tribble
5
BASIC a été inventé en 1964 , pas en 1962. Voir aussi ici . L'utilisation de LETest décrite à la page 7 du premier projet du manuel, daté de mai 1964, pdf ici .
Joseph Quinsey
Plus précisément, il consts'agit d'une référence d'objet constante ou immuable (en lecture seule) où l'objet lui-même est toujours modifiable. Par exemple. Après déclaration / assignation const foo = ['bar'], ce foo.push('bat')serait toujours légal, mais ce foo = ['bar', 'bat']n'est pas le cas. Mais c'est trop taper.
user982671

Réponses:

372

Let est une déclaration mathématique qui a été adoptée par les premiers langages de programmation comme Scheme et Basic. Les variables sont considérées comme des entités de bas niveau ne convenant pas à des niveaux d'abstraction plus élevés, d'où le désir de nombreux concepteurs de langage d'introduire des concepts similaires mais plus puissants comme dans Clojure, F #, Scala, où letpourrait signifier une valeur ou une variable qui peut être affectée, mais pas modifié , ce qui permet au compilateur de détecter plus d'erreurs de programmation et d'optimiser le code mieux.

JavaScript a eu vardepuis le début, donc ils avaient juste besoin d'un autre mot-clé, et ont simplement emprunté à des dizaines d'autres langages qui utilisent letdéjà comme mot-clé traditionnel aussi près varque possible, bien qu'en JavaScript letcrée à la place une variable locale de portée de bloc.

exebook
la source
94
Et la page officielle de documentation de Mozilla cite cette page pour cette question developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Sarath Chandra
9
C'est aussi bien cela len('var') === len('let'), ce qui signifie que vos déclarations s'alignent bien dans votre éditeur de toute façon. Je n'ai encore rien trouvé pour suggérer que c'était délibéré, mais cela peut être a) visuellement agréable et plus lisible, ou b) horriblement ennuyeux à déboguer si vous mélangez les deux (ce qui semble de toute façon une mauvaise idée, mais je '' Je l'ai vu faire).
brichins
13
En d'autres termes, leta été traditionnellement utilisé pour décrire une constante, car let C = the speed of lightJavascript a donc décidé d'utiliser let pour décrire une variable avec une portée non standard et en même temps d'introduire un autre mot clé pour les constantes.
fijiaaron
1
Je suis en désaccord qui letest proche var. De plus, Scala n'utilise pas, letdonc je ne vois pas en quoi c'est pertinent.
Aluan Haddad
3
@fijiaaron: Etendue non standard comment? N'est-ce pas étrange pour commencer avec la fonction entière, quel que soit le bloc que vous avez déclaré?
SamB
78

Je suppose que cela suit la tradition mathématique. En mathématiques, on dit souvent "que x soit un nombre réel arbitraire" ou comme ça.

Tigran Saluev
la source
Je préfère cette réponse plus car elle est brève et assez relatable car nous avons tous traversé l'algèbre, puis devrait probablement être suivie d'une explication comme ce que les autres soulignent.
duduwe
69

En plus de la réponse de exebook , l'utilisation mathématique du mot clé let résume également bien les implications de la portée letlorsqu'il est utilisé dans Javascript / ES6. Plus précisément, tout comme le code ES6 suivant n'a pas connaissance de l'affectation entre accolades toPrint lorsqu'il imprime la valeur de 'Hello World',

let toPrint = 'Hello World.';
{
    let toPrint = 'Goodbye World.';
}
console.log(toPrint); // Prints 'Hello World'

let tel qu'il est utilisé dans les mathématiques formalisées (en particulier l'écriture de preuves) indique que l'instance actuelle d'une variable n'existe que pour la portée de cette idée logique. Dans l'exemple suivant, x acquiert immédiatement une nouvelle identité en entrant dans la nouvelle idée (ce sont généralement des concepts nécessaires pour prouver l'idée principale) et revient immédiatement à l'ancien x à la fin de la sous-preuve. Bien sûr, tout comme dans le codage, cela est considéré comme quelque peu déroutant et est donc généralement évité en choisissant un nom différent pour l'autre variable.

Soit x tel ou tel ...

  Trucs de preuve

 Nouvelle idée {Que x soit autre chose ... prouve quelque chose} Conclure une nouvelle idée

 Prouver l'idée principale avec l'ancien x

Evan White
la source
19
Je pense que c'est vraiment utile. La réponse acceptée est presque un peu trompeuse, car elle parle de la valeur qui ne peut pas être modifiée, ce qui n'est pas letdu tout le cas. letest une question de portée.
jinglesthula
Juste une pensée: letme fait penser à quelque chose comme ça qui se passe dans l'esprit du rédacteur de code, "Ok, juste pour ce moment let foo = bar, mais alors il peut revenir à sa valeur d'origine ou cesser d'être. Ceci est parfaitement illustré dans les exemples pour Block Scope et Redeclaring Variables dans cette présentation de W3Schools de let. Encore une fois, ne prétendant pas apporter une réponse scientifique quelconque, mais la partageant davantage comme un moyen mnémotechnique pour se souvenir quand je veux l'utiliser let.
Alain
Je pense que cela vaut la peine d'être un peu plus précis ici, par souci de clarté conceptuelle. Votre exemple de code ES6 n'ignore pas l'affectation entre accolades. Il exécute l'affectation comme indiqué, sur une nouvelle variable toPrintqui n'existe que dans le bloc , puis jette consciencieusement cette variable lorsque le bloc se termine. Et à la sortie, nous sommes de retour dans la portée extérieure, où l'intérieur toPrintn'existe plus, console.log(toPrint)fait donc référence à l' extérieur toPrint . Ce n'est pas que quelque chose soit ignoré, c'est juste que les letvariables ont des durées de vie finies définies par leur portée.
FeRD
1
@FeRD, excellent point. J'ai apporté une modification à ce qui précède pour supprimer l'utilisation du mot «ignore» car il obscurcit le point.
Evan White
36

Il fait exactement ce que varfait une différence de portée. Maintenant, il ne peut pas prendre le nom varcar c'est déjà pris.

Il semble donc qu'il a pris le meilleur nom suivant qui a une sémantique dans une construction intéressante en langue anglaise.

let myPet = 'dog';

En anglais, il est dit "Que mon animal soit un chien"

Charlie
la source
5
Bien que l'origine de let puisse être linguistique et mathématique, la référence proche de chez soi est sans aucun doute l'instruction LET dans toutes les versions du langage de programmation BASIC, une que beaucoup des auteurs d'ES6 auraient commencé à apprendre s'ils étaient finis. 40 ans.
wide_eyed_pupil
5
@wide_eyed_pupil Juste FYI: en tant que plus de 40 ans (mais pas un auteur de ES6) qui a grandi sur BASIC, aucune des communautés avec lesquelles j'étais impliqué n'a utilisé le LET dans la pratique courante; nous avons juste assigné des variables, comme Python le fait maintenant (par exemple A$="HELLO WORLD") Les interprètes impliqués incluaient Rockwell AIM 65 BASIC, Atari Basic, MBASIC 5 sur CP / M, Applesoft BASIC et même BASCOM, le compilateur MS BASIC sur CP / M. VAX BASIC avait le LET, mais ne l'exigeait pas, si je me souviens bien. La mémoire était alors restreinte et les 3 ou 4 caractères supplémentaires du texte du programme par instruction faisaient une différence, en particulier dans les "gros" programmes.
Peter Hull
@PeterHull C'est intéressant, j'ai fait mon premier codage sur des cartes marquées au crayon attachées à un processeur numérique, puis des mainframes au laboratoire de recherche du vieil homme et un PDP8 numérique à l'école. Je n'ai jamais vu les gens utiliser le LET sans utiliser la déclaration, pas dans les livres que j'ai lus non plus. Remarquez que j'ai été encouragé à coder en FORTRAN et PASCAL dès que j'ai obtenu du bon, le basique étant aussi mauvais qu'il l'était, sans même avoir GOSUB (c'est-à-dire des fonctions réutilisables) dans les versions que j'ai utilisées.
wide_eyed_pupil
Vous ne pouvez pas redéclarer une variable let.
CONvid19
10

La possibilité la plus probable était qu'il s'agissait du choix le plus idiomatique. Non seulement il est facile à parler, mais plutôt intuitif à comprendre. Certains pourraient argumenter, encore plus que var.

Mais je pense qu'il y a un peu plus d'histoire à ce sujet.

De Wikipédia :

Le langage LCF de Dana Scott a été une étape dans l'évolution du calcul lambda en langages fonctionnels modernes. Cette langue a introduit l'expression let, qui est apparue dans la plupart des langages fonctionnels depuis cette époque.

Les langages impératifs à état complet tels que ALGOL et Pascal implémentent essentiellement une expression let, pour implémenter une portée restreinte de fonctions, dans des structures de blocs.

J'aimerais croire que c'était aussi une inspiration, pour le letJavascript.

oxalorg
la source
Cette réponse se réfère à l'expression let let du lambda calcul, qui n'est peut-être pas ce que le PO a demandé. Et il semble que ce soit plus tard que LETdans BASIC, à partir de 1964.
Joseph Quinsey
Cet article est l'un des nombreux écrits à lui seul par l'utilisateur de Wikipedia Thepigdog en 2014. Je serai judicieux et je dirai simplement qu'ils sont tous rédigés dans une perspective très étroite, de sorte que la revendication (sans référence) citée devrait être interprété comme disant que l'article de Scott "introduisait" l'expression let dans le calcul lambda , de la même manière que ES6 introduisait letJavaScript. Pas complètement faux, pour autant que cela va, mais sans réelle signification. (Et LET
n'excluant
1

Let utilise une portée limitée de niveau bloc plus immédiate alors que var est généralement une portée de fonction ou une portée globale.

Il semble que let ait été choisi très probablement parce qu'il se trouve dans de nombreux autres langages pour définir des variables, telles que BASIC, et bien d'autres.

OG Sean
la source
1

Je pense que l'endettement de JavaScript envers Scheme est évident ici. Le schéma a non seulement let, mais a let *, let * -values, let-syntax et let-values. (Voir, The Scheme Programming Language, 4e éd.).

((Le choix ajoute plus de crédibilité à la notion que JavaScript est Lispy, mais - avant de nous laisser emporter - pas homoiconique.)))))

Eric H.
la source
1

Cela pourrait aussi signifier quelque chose comme "Lexical Environment Type or Tied" .. Cela me dérange que ce soit simplement "que ce soit ça ". Et que rec n'aurait aucun sens dans le calcul lambda.

Sébastien Paquet
la source
Je cherchais une réponse comme celle-ci, je doute aussi qu'elle ait le sens anglais général de "let"
Meenohara