こんにちは、かずん(@kazoonLab)です。前回の記事では、「JavaScriptのスコープ」についてお話ししました。宣言のベストなやり方はじめにそれぞれの使い方varとはletとはconstとはまとめはじめにそもそも変数とは何か、という話に関しては今回は触れません。const」それぞれの振る舞いが、どのように異なるかを見ていきたいと思います。変数の基礎的な部分が分からなければ、このリンクが参考になるかと思います。それぞれの使い方varとはvarは、古くから変数宣言に用いられてきました。スコープである・巻き上げが発生する・再定義できる・再代入できるスコープについては以下の記事にて触れていますので、そちらをご覧ください。blog.mimipen.netそれでは、例を見てみましょう。newGlobal;変数の初期化とは、変数宣言と同時に値を代入する行為を指します(上記2のように)(1)では変数宣言のみ行い、値の代入はしていません。この場合、変数globalはデフォルト値undefinedで初期化されます。関数globalFunc()内で変数localが宣言されている(2)ため、この関数の外からは変数localは参照できません。(3)(4)のように、varで宣言された変数は再定義できます(できてしまいます)。変数を多重に宣言することは、意図しないコードの挙動(バグ)の原因となり得ます。varには「巻き上げ」という仕様があります。これは、「あるスコープの中で宣言された変数は、スコープのどの位置で宣言されようとも、スコープの戦闘で宣言されたことになる」というものです。(5)以下の挙動は、以下のコードと同じになります。newGlobal;(6)でundefinedな値を参照していますがエラーになっていません。これも、意図しない挙動といえるでしょう。次にletを見ていきましょう。letとはletは、varの不安定な箇所を補うべく誕生しました。ブロックスコープである・巻き上げが発生するが、エラーになる・再定義できない・再代入できる例を見てみましょう。global5varと同様、初期化せず宣言した変数はundefinedで初期化されます(1)。(3)で初期化する前に変数の呼び出しをするとエラーになります(2)。ここがletとvarで異なるポイントです。厳密にいえば、巻き上げは発生しているのですが、代入前の参照はエラーになるという仕様となっています。(4)のように、ブロック内で宣言した変数は外から参照できません。このため、ブロック外での意図しない更新を防ぐことができます。最後に、最も厳密な宣言「const」を見ていきましょう。constとはconstは、letよりも厳密な変数宣言を行うべく誕生しました。constは、以下の特徴を持ちます。・ブロックスコープである・巻き上げが発生しない・再定義できない・再代入できない(例外有り)例を見てみましょう。(error)constで宣言される変数は、宣言と同時にに初期化しなければならず、また再代入・再定義できません。ブロックスコープであるため、ブロック外からの参照もできません。巻き上げについても、宣言と一見すると不便なように見えますが、実はとてもありがたい存在なのです。その理由を考えてみましょう。「この変数は絶対にほかの場所では使われていない。この変数は常に最初の値のままである」と考えることができるでしょう。ソースコードを書く人は、意図しない参照を防ぐ(しようとするとエラー)ことができます。ソースコードを読む人は、ブロック内のconst変数は常に変わらない(*)と信じて読むことができます。まとめると、constを利用することで、書き手・読み手双方の心理的負担、また費やす時間を削減することができるのです。(*)プリミティブな値(数字、文字列、...)は再代入できませんが、オブジェクトや配列の中の値の更新はできてしまいます。constそれぞれの特徴について見てきました。「原則宣言はconstで行い、再代入の必要があればletを使う」のが良いのではないかと思います。varには別れを告げてしまいましょう。この記事を読んでくださった方のソースコードが、よりよくなることを願ってやみません。最後までご覧いただきありがとうございます。こんにちは、かずん(@kazoonLab)です。こんにちは、かずん(@kazoonLab)です。こんにちは、かずん(@kazoonLab)です。かずんスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。