JavaScriptのブロックスコープの変数宣言に「let」という名前が選ばれたのはなぜですか?


306

なぜvarその名前をとるのか理解します-それは変数ですconst-それは定数ですが、の名前の背後にある意味は何letですか?現在のブロックにスコープしますか?なるがままに?


7
1962年に発明されたBASICが使用されましたLET。以前の言語の例があるかもしれません。
David R Tribble 2017

5
BASICは1962 ではなく1964年に発明されましたこちらも参照してください。使用LET1964年5月日付けマニュアルの最初のドラフトの7ページで説明され、ここにPDF
ジョセフクインジー2018年

より具体的にconstは、定数または不変(読み取り専用)オブジェクト参照であり、オブジェクト自体はまだ変更可能です。例えば。宣言/割り当ての後const foo = ['bar']foo.push('bat')それでも合法ですが、そうでfoo = ['bar', 'bat']はありません。しかし、それはタイピングが多すぎます。
user982671

回答:


372

Letは、SchemeやBasicなどの初期のプログラミング言語で採用された数学ステートメントです。変数は高レベルの抽象化には適さない低レベルのエンティティと見なされます。したがって、Clojure、F#、Scalaのようなlet、値または割り当て可能な変数を意味する可能性がある同様のより強力な概念を導入したいという多くの言語設計者の要望は、ただし、変更されていません。これにより、コンパイラはより多くのプログラミングエラーをキャッチし、コードをより最適化できます。

JavaScriptはvar最初から存在していたため、別のキーワードが必要であり、JavaScript は代わりにブロックスコープのローカル変数を作成しますが、できるだけ多くletの従来のキーワードとして既に使用されている他の何十もの言語から借用しました。varlet


94
そして、公式Mozillaのドキュメントのページには、この質問のために、このページを引用developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
Sarathチャンドラ

9
それはまたlen('var') === len('let')、あなたの宣言があなたのエディタでどちらかの方法でうまく整列することを意味します。私はこれが意図的なものであることを示唆するものをまだ見つけていませんが、それはa)視覚的に心地よく、より読みやすい、またはb)2つを混合した場合にデバッグするのがひどく面倒なことです(とにかく悪い考えのようですが、私は完了したことを確認しました)。
brichins 2017年

13
つまり、Javascriptがletを使用して非標準のスコープを持つ変数を記述し、同時に定数の別のキーワードを導入することを決定しletlet C = the speed of lightように、伝統的に定数を記述するために使用されてきました。
フィジーアロン

1
let近いとは思いませんvar。また、Scalaは使用しないletので、それがどのように関連しているかはわかりません。
Aluan Haddad

3
@fijiaaron:非標準のスコープ指定方法は?まず、関数全体に関係なく、どのブロックを宣言したかは、最初から奇妙なことではありませんか?
SamB

78

私はそれが数学的伝統に従っていると思います。数学では、「xを任意の実数にしよう」などとよく言われます。


この答えは簡潔でかなり関係があるので、私はこの答えを好みます。すべての代数を調べた結果、おそらく他の人が指摘しているような説明が続くはずです。
duduwe

69

追加exebookの応答、キーワードの数学の使用量は、聞かせても十分のスコーピングの影響カプセル化letJavascriptを/ ES6で使用する場合に。具体的には、次のES6コードの値を出力するtoPrint ときの括弧内の割り当てを認識しないの'Hello World'同様に、

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

公式化された数学(特に証明の記述)で使用れているletは、変数の現在のインスタンスがその論理的アイデアの範囲にのみ存在することを示します。次の例では、xは新しいアイデアを入力するとすぐに新しいIDを取得し(通常、これらはメインのアイデアを証明するために必要な概念です)、副証明が完了するとすぐに古いxに戻ります。もちろん、コーディングの場合と同様に、これはやや混乱を招くと考えられているため、通常、他の変数に別の名前を選択することで回避できます。

xがそうであるように...

  証明のもの

 新しいアイデア{xを別のものにする...何かを証明する}新しいアイデアをまとめる

 古いxで主なアイデアを証明する


19
これは本当に便利だと思います。受け入れられた答えは、値を変更できないことについて話しているため、ほとんど誤解を招くものletです。 letスコープのすべてです。
jinglesthula 2017

ちょうど考え:letコードライターの心の中でこのようなことが起こっていることを考えさせlet foo = barます。ブロックスコープのための例として変数を再宣言このW3Schoolsのプレゼンテーションlet繰り返しに、ある種の科学的な答えをもたらすに装って、より多くの私が使用したいときに覚えておくべきニーモニックデバイスとしてこれを共有しません。let
アラン・

ここでは、概念を明確にするために、もう少し正確にする価値があると思います。ES6のコード例では、「中括弧内の割り当てを無視」していません。ブロック内にのみ存在する新しい変数に対してtoPrint指示どおりに割り当てを実行し、ブロックが終了すると、その変数を忠実に破棄します。そして終了時に、我々は、内側が外側のスコープ、にいるバックtoPrintもはや存在しないが、これconsole.log(toPrint)を指し toPrint。何も無視されているわけではありませんlet。変数のスコープによって定義された有効期間が変数にあるだけです。
FeRD

1
@FeRD、優れた点。上記を編集して、「無視する」という言葉がポイントを不明瞭にするので、その使用を削除しました。
エヴァンホワイト

36

これはvar、スコープの違いで正確に実行します。名前varは既に取得されているため、取得できません。

それで、興味深い英語の構成に意味を持つ次善の名前を取っているようです。

let myPet = 'dog';

英語では「ペットを犬にしよう」と書かれています


5
letの起源は言語的および数学的なものかもしれませんが、疑いなく自宅に近い参照は、すべてのバージョンのBASICプログラミング言語のLETステートメントであることは間違いありません。 40年。
wide_eyed_pupil

5
@wide_eyed_pupil参考までに:BASICで育った40歳以上(ES6の作者ではありません)として、私が関わっていたどのコミュニティもLETを一般的な方法で使用していませんでした。Pythonが行うように、変数を割り当てただけです(例A$="HELLO WORLD":)。関係するインタプリタには、Rockwell AIM 65 BASIC、Atari Basic、CP / M上のMBASIC 5、Applesoft BASIC、さらにはCP / M上のMS BASICコンパイラであるBASCOMも含まれていました。VAX BASICにはLETがありましたが、覚えていましたが、必要ではありませんでした。当時のメモリはタイトで、特に「大きな」プログラムでは、ステートメントごとにプログラムテキストの3〜4文字が余分に影響しました。
Peter Hull

@PeterHull興味深いことに、筆者は最初にデジタルCPUに接続された鉛筆でマークされたカードをコーディングし、次に老人の研究室のメインフレームと学校のデジタルPDP8をコーディングしました。私が読んだ本ではなく、実際に声明を使わずに人々がLETを使うのを見たことがない。私が使用したバージョンにGOSUB(つまり、再利用可能な関数)がなくても、基本的には良くなり、基本が悪くなるとすぐに、FORTRANとPASCALでコーディングすることを勧められました。
wide_eyed_pupil

let変数を再宣言することはできません。
CONvid19

10

最も可能性が高いのは、それが最も慣用的な選択だったということです。話しやすいだけでなく、直感的に理解できます。何人かは、それ以上に主張することができvarます。

しかし、これにはもう少し歴史があると思います。

ウィキペディアから:

ダナ・スコットのLCF言語は、ラムダ計算を現代の関数型言語に進化させる段階でした。この言語は、それ以来、ほとんどの関数型言語で出現しているlet式を導入しました。

ALGOLやPascalなどのステートフルな命令型言語は、ブロック構造で関数の制限されたスコープを実装するために、基本的にlet式を実装しています。

これはletJavascriptのインスピレーションでもあったと思います。


この答えは、ラムダ計算の「let式」を参照しています。これは、おそらくOPが要求したものではありません。そして、後でよりように見えるLET1964年から、BASICで
ジョセフQuinsey

その記事全体は、2014年にWikipediaのユーザーThepigdogが基本的に単独で書いたいくつかの記事の1つです。スコットの論文は、ES6 がJavaScriptに導入したのと同じ方法で、ラムダ計算に let式「導入」したと解釈しましたlet。限りなく不正確ではありませんが、本当の意味はありません。(そしてスコットの "let"の使用 BASICに触発された可能性を排除するものでは決してありませんLET。)
FeRD

1

通常はvarが関数スコープまたはグローバルスコープであるのに対して、より即時のブロックレベル限定スコープを使用します。

letが選ばれた可能性が最も高いのは、BASICなど、他の多くの言語で変数を定義するために使用されているためです。


1

JavaScriptのSchemeに対する負債はここで明白だと思います。Schemeにはletだけでなく、let *、let * -values、let-syntax、let-valuesもあります。(Schemeプログラミング言語、第4版を参照)。

((この選択は、JavaScriptがLispyであるという概念にさらなる信憑性を追加します。


1

それは可能性も、「タイド字句環境タイプか」のような平均何かが...それは単に「聞かせてであろうと、私を悩ますこの BEをすることを」。そして、recがラムダ計算で意味をなさないようにします。


私もそれが「せ」の一般的な英語の意味を持って疑うこの私のような答えを探していた
Meenohara
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.