JavaScriptにおける変数の「宣言」と「初期化」の違いとは?
JavaScriptでは、「変数を宣言する」ことと「変数を初期化する」ことは、厳密には異なる2つの処理として扱われます。この違いを正しく理解すると、var の巻き上げ(ホイスティング)などの一見不可解な挙動も自然に説明できるようになります。
ECMAScript仕様での定義
ECMAScriptの仕様書では、変数の宣言と初期化について次のように定められています。
「var文は、実行中の実行コンテキストの VariableEnvironment にスコープされる変数を宣言する。var変数は、それを包含するレキシカル環境(Lexical Environment)がインスタンス化される際に生成され、生成された時点で
undefinedに初期化される。
[...]
一方、初期化子(Initializer)を持つ変数宣言によって定義された変数には、その初期化子の代入式(AssignmentExpression)の値が、変数宣言が実行されるときに代入される。つまり、変数が生成されるときではない。」
この記述から読み取れるポイントは以下の3点です。
- すべての変数は
undefinedという値で初期化される。 - 変数宣言は、その変数を含むレキシカル環境の初期化時点で
undefinedに設定される。 - この初期化は代入(アサインメント)としては機能しない。
具体例で確認する
実際のコードで動作を見てみましょう。
console.log(num); // undefined(宣言が巻き上げられ、undefinedで初期化済み)
var num = 100; // この行が実行されて初めて値が代入される
console.log(num); // 100
1行目の時点ではまだ代入文が実行されていないにもかかわらず、エラーにならず undefined が出力されます。これは、変数の生成と初期化(undefinedの設定)はコード実行前に完了している一方で、初期化子による値の代入はその行が実際に実行されたときに行われるためです。
let / const との違い
let や const でも変数は生成時に undefined で初期化されますが、宣言文が実行されるまでの間はアクセスできず、参照しようとすると ReferenceError が発生します。この領域は「TDZ(Temporal Dead Zone/一時的デッドゾーン)」と呼ばれます。そのため、var のように宣言前のアクセスが undefined を返すことはありません。
まとめ
- 宣言=変数を環境に登録し、
undefinedで初期化する処理 - 初期化(代入)=宣言文が実行されたときに、初期化子の評価結果を変数に割り当てる処理
- 両者は発生するタイミングが異なるため、
varでは宣言前に参照してもエラーにならない
-
JavaScriptにおける関数とメソッドの違いとは?わかりやすく解説
JavaScriptにおいて、関数とメソッドは本質的には同じものです。両者の違いは、メソッドがオブジェクトのプロパティとして定義された関数であるという点にあります。つまり、独立して定義されたものを「関数」、オブジェクトに紐づけられたものを「メソッド」と呼びます。 JavaScriptの関数の基本形 まず、一般的な関数の定義方法を見てみましょう。 function functionname(param1, param2){ // 処理内容 } JavaScriptのメソッドの例 メソッドは、オブジェクトに関連付けられた関数です。次の例では、employeeオブジェクトの中にdetails
-
JavaとJavaScriptの違いとは?歴史・技術・使い分けを徹底解説
ウェブ開発者のジェレミー・キースは2009年、「JavaとJavaScriptの関係は、ハムとハムスターの関係のようなものだ」と語りました。この比喩がどれほど正確かは議論の余地がありますが、その本質は的確です。共通する言語的ルーツを持つにもかかわらず、JavaとJavaScriptはまったく異なる2つのプログラミング言語なのです。年月とともに両者の重なりも多少増えましたが、今なおJavaScriptはウェブサイトにインタラクティブ性をもたらすフロントエンド言語の主流であり続け、Javaはサーバーサイドやアプリケーション開発で人気を保っています。開発者を採用したい方、プログラミングを学びたい方