let (JavaScript)
読み:れっと
外語:let
JavaScriptに3種類ある変数・定数宣言のうちの一つで、ブロックスコープのローカル変数を宣言する。JavaScript 1.7およびECMAScript 2015 (ES6)から追加された。
概要
再代入が可能な「変数」を定義するために使う、一般的な宣言である。
varと違いバグを誘発する再宣言はできず、またスコープもブロックスコープに限定されるという特徴がある。
構文
let宣言
let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN];
カンマで区切って1行に複数の変数を宣言できる。また、それぞれで初期値の定義もできる。
他の使い方
for文の中で使うlet宣言。
for (let i = 0; i < 3; i++) { ... }
ブロックスコープ内でletによる再定義がある場合、varの効果が及ばない。
var a = 10;
{
console.log(a); // ※アクセスできない。これがあるとエラーで以降実行されないので注意※
let a = 20;
console.log(a); // 結果は`20`
}
console.log(a); // 結果は`10`
一つ目のconsole.log(a)は参考のために記載されているが、これがあると動作しないので実験する場合は注意が必要である。なお実装によっては動作し、結果がundefinedになるものもある。
let文(letブロック)
JavaScript 1.7にはlet文(letブロック)としての用法が存在した。
var a = 10;
let (a = 2 * a) {
console.log(a); // 結果は`20`
}
console.log(a); // 結果は`10`
しかしこの仕様はECMAScript 2015 (ES6)には採用されず、Mozilla FirefoxでもECMAScript 2015 (ES6)準拠のためにFirefox 44以降では仕様から削除され利用できなくなった。
補足
由来
従来のJavaScriptは、大まかにはグローバルスコープと関数スコープしか存在しなかった。
これは理由が明確で、JavaScriptの設計思想として「ブロックはスコープではなかった」からである。しかしJavaScriptで大規模アプリケーションを作成する時代になると、この設計は需要にそぐわなくなった。JavaScriptを設計していたブレンダン・アイクが取れる解決策は一つしかなく、結果、ブロックスコープで変数宣言をするための新しいキーワードを追加した。それがletである。
JavaScript 1.7からlet文、let式、let宣言が導入され、2006(平成18)年リリースのFirefox 2.0に搭載された。当時ECMAScriptの策定が紛糾していたこともあり、ECMAScriptでは遅れてECMAScript 2015から導入されている。
varにあった諸問題を解決させる、次のような特徴がある。
- let変数はブロックスコープである
- グローバルlet変数は、グローバルオブジェクトのプロパティではない
- for (let x...)形式のループは、反復ごとに新しいバインディングを作成する
- let宣言に到達する前に変数を使用しようとするとエラーになる (varにあるHoisting(巻き上げ)は存在しない)
- 再宣言はできない
letに決まった理由
なぜ変数宣言の用語に let が選ばれたかは、それ以前に使われていたプログラミング言語の影響がある。
letは英語の動詞であるとともに、プログラミング言語BASICで変数宣言に使われるようになって以降、伝統的にプログラミングにおいて変数などの宣言を意味するようになった。iOSで使われるプログラミング言語Swiftでletは定数宣言(Androidで使われるプログラミング言語Kotlinにおけるval相当)であるなど同時期に流行するプログラミング言語で互いに異なる意味を持つことはあるが、このようにしてプログラミング言語におけるletという語は歴史的な意味を持っている。
再検索