2.0.3let宣言は、変数をブロックスコープの{}の中に定めます。変数のvar宣言との違いを、ふたつの例でご説明します。for文でカウンタ変数を参照する例つぎのTypeScriptコードは、for文の中でwindow.setTimeout()メソッドを定めます。時間差でconsole.log()により、カウンタ変数(i)の値が順にコンソールに示されるはずです。i);このようなコードを書いた場合、0から始まる整数連番が出てくることを期待しているでしょう。ところが、つぎのように値はすべて同じ整数になります。window.setTimeout()メソッドの第1引数に与えたコールバック関数が呼び出されたとき、すべて同じグローバル変数(i)の値を参照するからです。555555これは、var宣言がブロックスコープをもたないことによります。関数の本体でvar宣言した変数や引数はローカルで扱われ、グローバル変数とは区別されます。そこで、つぎのようにfor文の中で即時関数(名前のない関数を直ちに呼び出す)を定めて、引数(i)をwindow.setTimeout()メソッドのコールバックに参照させます。すれば、関数の呼び出しごとに引数が別扱いになります。コンソールには、以下のように0から始まる連番整数が示されます。i);})(i);}01234カウンタ変数(i)をつぎのようにlet宣言すれば、for文のブロックスコープの{}の中はループするごとに別の空間として扱われます。したがって、コンソールには上記とおなじ整数連番が表れます。入れ子のfor文で同じカウンタ変数を使う例まず、数値の配列をつくりましょう。その場合のTypeScriptの型づけは、number[]です。)、つぎのようなコードを書きます。親配列の中に子配列を納めることにより、多次元の行列が表せます。9]]この入れ子配列のエレメント(行列成分)すべてを足し合わせるとします。3])の合計(6)しか得られません。sum;}入れ子のfor文で親と同じ名前のカウンタ変数(i)をvar宣言しました。ところが、ブロックスコープがありませんので、同じ変数として扱われてしまうのです。その結果、つぎのコードのような処理になります。matrix.length)を外れてしまうのです。6宣言varを以下のようにすべてletに書き替えれば、{}プロックごとにスコープは分けられ、正しく2次元配列エレメントの合計が得られます。関数の中でひとつしか宣言のない変数(sumとcurrentRow)は、varを用いても構いません。let宣言なら、ブロックの外との重複など気にしなくて済みます。var宣言を使わなければならない場合はほとんどないでしょう。宣言constとletconst宣言もブロックスコープをもちます。let宣言との違いは、定数(変数)値が書き替えられないことです。したがって、値を書き替えるならlet、変わらない値を使い続けるならconstとすれば、コードが見やすくなります。気をつけていただきたいのは、const宣言した変数は書き替えられなくても、参照するオブジェクトのプロパティ値は変えられるということです。つぎのコードはconst宣言した変数に納めたオブジェクトのプロパティ値をエラーなく変更しています。TypeScriptのバージョンを2.0.3に更新。