menu
書いてる野郎
orebike@gmail.com
ブロックスコープを持つ再代入可能な変数である。 ブロックスコープではあるのだが、巻き上げがおこらない。 これが重要。
ループ内で宣言される let は var とは違うちょっと注意するべき点がある。
for の中の i とかもこのケースにあたる
ループ内の let は let が使われる度に変数空間が作られてそれに対して変数名でポイントしておくような挙動になる。 そしてブロックが終わるとこのポイントが破棄される。
新たに変数空間が作られて変数名でポイントされる。
これがわかるのがクロージャでこの let を持ち込んだ場合で、 let の変数はループの度に新しく作られるのでその内部で作られた関数に持ち込まれる変数の指し示す先が毎度変わるということになる。挙動だけ見るなら関数が作られたタイミングの let の内容で固定化しているかのように見える。 実際は固定などという仕組みはなくループの数だけ空間が作られているので参照先が違うだけなのだが。
このへんが注意が必要である。
↑何言ってるかわからないと思うが、この性質は以下のような場合に便利に働く。
var 宣言した変数をループ内でクロージャで関数内に持ち込むと、全部の関数の中の値がループ終了時のモノになってしまうというのがある。
しかし let でこれをやるとこれが起こらないのである。 関数の中はその関数が作られたタイミングの let の中身で固定されるのである。