JavaScriptでの変数宣言にはvar
, let
, const
の3つのキーワードがあります。それぞれのキーワードには特定の特徴とルール・制限が存在しており、場面に応じた適切な使い分けが重要になるので、このページではそもそも変数って何?という基本知識から、JavaScriptにおけるvar
, let
, const
の3つのキーワードの使い分けまで整理して解説します。
結論を超ザックリいえば、変数宣言するなら「let」。定数を宣言するなら「const」。「var」は古い宣言方法なので基本使わない!と覚えればOK。そのうえで、古いコードでは「var」も使われているから一応理解しておきましょう!という内容です。
キーワード | スコープ | 再代入可能 | 巻き上げ(Hoisting) |
---|---|---|---|
var | 関数スコープ | 〇 | 〇 |
let | ブロックスコープ | 〇 | × |
const | ブロックスコープ | × | × |
- 関数スコープ
- 宣言された変数が関数内でのみ参照可能
- ブロックスコープ
- 宣言された変数がブロック(
{}
で囲まれた範囲)内でのみ参照可能
- 宣言された変数がブロック(
- 再代入可能
- 変数に値を再度割り当てることが可能
- 巻き上げ
- 変数宣言がコード実行前にトップに移動されるJavaScriptの挙動
このページではvar
, let
, const
がどのように使われるべきか、それぞれの選択がプログラミング上でどのような影響を与えるかについて深く掘り下げていきます。正しい変数宣言方法の選択は、エラーを減らし、コードの可読性を高める重要なステップです。それぞれの使い方・特徴・制限をしっかりおさえておきましょう!
それでは、各キーワードの詳細な解説を始めます。
参考 【JavaScript入門】基本文法/基礎文法を5分で復習
JavaScriptの変数宣言:var
JavaScriptでは、var
キーワードを使用して変数を宣言することができます。この変数には数値、文字列、オブジェクトなど、どのようなタイプの値も格納することが可能です。
冒頭でも述べた通り、var
はJavaScriptで最も古い変数宣言のキーワードです。ちょっと厄介な性質を持つので今ではあまり利用されませんが、古いコードではvarが利用されているシーンもあるので一応冒頭で解説しておきます。
サンプルコード 基本的な宣言と使用
var message = 'こんにちは、世界!'; console.log(message); // 出力: こんにちは、世界!
↑のコードでは、message
という名前の変数を宣言し、文字列'こんにちは、世界!'
を代入しています。console.log
を使ってこの変数の内容をコンソールに出力すると文字列'こんにちは、世界!'
が表示されるという簡単なコードです。
ちなみに、変数というのは値を入れておく「箱」のようなもので、この「箱」の中に入っているデータを変えたり参照したりすることで1つのプログラムが動いていきます。プログラムで計算を行う際、文字列を操作する際など、ありとあらゆる場面で一般的に利用される概念です。詳しくはこちら(変数とは?)で解説します。
var:変数の再代入
var
で宣言された変数は後から値を変更することができます。
これを「再代入」と呼びます。
サンプルコード 変数の再代入
var number = 10; console.log(number); // 出力: 10 number = 20; console.log(number); // 出力: 20
最初にnumber
変数に10
を代入。次に20
を再代入しています。var
は何度でもこの値を変更することができ、プログラムの要求に応じて自由に再代入を繰り返すことが可能です。
これは、後述するconstキーワード(再代入ができない)とは異なる特徴を持ちますのでしっかりと頭に入れておきましょう。
var:巻き上げ(Hoisting)
var
で宣言された変数は「巻き上げ」されます。「巻き上げ(Hoisting)」は、JavaScriptでの変数宣言や関数宣言がコード実行前にそのスコープの最上部に移動されるように見える挙動を指します。
ザックリいえば、どこで変数宣言しても、コード(もしくはそのスコープ内)の1番上で実行されるということ。
サンプルコード 巻き上げの挙動
console.log(myVar); // 出力: undefined var myVar = '変数は巻き上げられます。'; console.log(myVar); // 出力: 変数は巻き上げられます。
↑の例では、myVar
変数が宣言される前にconsole.log
で参照されています。通常のプログラミング言語の場合、宣言される前の変数が参照された場合にはエラーが発生しプログラムはストップすることが多いのですが、JavaScriptは変数myVar
を巻き上げるため、最初のconsole.log
はundefined
を出力する形でエラーが発生しません。
この「巻き上げ」が意図するものである場合は問題ありませんが、undefined
を出力するシーンというのは一般的には多くはない→つまり、コーディングミスであるにも関わらず、エラーが発生しないため、バグが多発してしまう・・・という欠点があります。
そのため「var」は現代ではあまり利用されず「const」が変数宣言としてポピュラーです。
var:関数スコープ
var
で宣言した変数は関数スコープを持ちます。→関数内で宣言された変数は、その関数内部からのみアクセス可能であるということ。
参考 関数とは?
サンプルコード 関数スコープの例
function sayHello() { var greeting = 'Hello World!'; console.log(greeting); // 出力: Hello World! } sayHello(); console.log(greeting); // エラー: greeting is not defined
参考 関数:function文
↑の例では、greeting
変数はsayHello
関数内で宣言されています。そのため、関数の外部からgreeting
にアクセスしようとすると、エラーが発生します。
JavaScriptの変数宣言:let
JavaScriptでのlet
キーワードの使用は、var
に比べてより現代的な変数宣言の方法です。let
による変数宣言は特にブロックスコープを利用することが大きな特徴。この章では、let
の使い方について解説します。
サンプルコード 基本的な宣言と使用
let message = 'こんにちは、世界!'; console.log(message); // 出力: こんにちは、世界!
このコードでは、message
という名前の変数をlet
で宣言し、文字列'こんにちは、世界!'
を代入しています。この変数は、宣言された場所からアクセス可能です。
宣言する際の基本的な構文ルールとしては「var」と相違ありません。
let:ブロックスコープ
let
で宣言された変数はブロックスコープを持ちます。分かりやすく言い換えると、変数が{}
で囲まれたブロック内でのみアクセス可能であるということ。
var
が持つ関数スコープ(変数はその変数が宣言された関数全体からアクセス可能)とは異なり、ブロックスコープではより限定的な範囲で変数を制限することができます。
サンプルコード ブロックスコープ内での使用
function testScope() { if (true) { let blockScopedVar = '私はこのブロック内でのみ存在します'; console.log(blockScopedVar); // 出力: 私はこのブロック内でのみ存在します } // console.log(blockScopedVar); // ReferenceError: blockScopedVar is not defined } testScope();
↑の例では、blockScopedVar
変数はif
文のブロック内でlet
を使って宣言されています。この変数はブロック内部からのみアクセス可能であり、ブロックの外側からは参照することができません。もしブロックの外側でblockScopedVar
にアクセスしようとすると、ReferenceError
が発生します。
let
のこの挙動は、プログラムの特定の部分でのみ変数を使用したい場合に有用であり、変数のスコープをより細かく管理することを可能にします。
let:変数の再代入
let
で宣言された変数も、varと同様で再代入が可能です。ただし、同じスコープ内で同じ名前の変数を再宣言することはできません。
サンプルコード 再代入の例
let number = 10; console.log(number); // 出力: 10 number = 20; console.log(number); // 出力: 20 let number = 30; // エラー: 'number' has already been declared
最初にnumber
に10
を代入し次に20
を再代入しています。ただし、再度同じ名称のnumber
を再宣言しようとするとエラーが発生します。これはvarとは異なる挙動のためしっかりと頭に入れておきましょう。
逆に言うと、同じ「箱」を何個も作れないようになっているので、その分プログラム全体が綺麗になります。var は同じ名前でいくらでも変数を作れてしまうので、バグが大量発生→let が誕生という経緯です。
ポイント let
の使用時の注意点
let
で宣言された変数はブロックスコープを持つため使用する際はスコープに注意。- 再宣言はできないため、同じ名前の変数を同一スコープ内で使用する際には注意が必要。
let
はモダンなJavaScript開発においてvar
の代替として推奨されている。
let
を使用することで、コードの可読性と保守性が向上し、特に複雑なアプリケーションを開発する際にバグを減らすことができます。
JavaScriptの「定数」宣言:const
JavaScriptにおけるconst
キーワードは「定数を宣言する」ために使用されます。const
で宣言された変数は再代入が不可能で、ブロックスコープのルールに従います。これは一度値が割り当てられると、その変数の値を変更することができないことを意味します。
const
の使用は、プログラム内で変更されるべきではない値を扱う際に非常に便利です。
サンプルコード 基本的な宣言
const greeting = 'こんにちは、世界!'; console.log(greeting); // 出力: こんにちは、世界! const greeting = 10; // greeting = 20; // TypeError: Assignment to constant variable.
↑のコードでは、greeting
という名前の定数をconst
で宣言し、文字列'こんにちは、世界!'
を代入しています。const
で宣言された後は値を変更することはできません。無理やり変えようとしてもエラーが発生するだけです。
const:ブロックスコープ
const
で宣言された変数もlet
と同様にブロックスコープを持ちます。→変数が定義されたブロック({}
で囲まれた範囲)内でのみアクセス可能であるということです。
サンプルコード ブロックスコープの例
{ const localMessage = 'ブロック内のメッセージ'; console.log(localMessage); // 出力: ブロック内のメッセージ } // console.log(localMessage); // エラー: localMessage is not defined
↑の例では、localMessage
定数はブロック内でconst
によって宣言されています。ブロックの外からはアクセスできません。
const:再代入の禁止
先ほども解説した通りなので、再度ご説明。const
で宣言された変数は、再代入することができません。試みると、エラーが発生します。
サンプルコード 再代入の試み
const number = 10; console.log(number); // 出力: 10 // number = 20; // エラー: Assignment to constant variable.
number
定数に10
を代入した後、20
に値を変更しようとすると、JavaScriptエンジンはエラーを投げます。
ポイント const
の使用時の注意点
const
で宣言された変数は再代入が不可能ですが、オブジェクトや配列のプロパティは変更できます。- 初期化時に値を割り当てる必要があります。宣言のみで初期化を行わないとエラーになります。
const settings = { volume: 10, brightness: 70 }; settings.volume = 20; // これは可能 console.log(settings); // 出力: { volume: 20, brightness: 70 }
const
はプログラム内の固定値を扱う際に非常に役立ち、コードの意図を明確にすることができます。値が変更されることを期待しない変数にconst
を使用することで、プログラムの安全性と可読性を高めることができます。
スキルアップを手軽に!
話題のサブスク型プログラミングスクールをご紹介。
SAMURAI TERAKOYA
月額2,980円から始める-入会金不要/途中解約自由。無料体験プランからスタート可能!
飲み会1回分以下の料金で継続的なスキルアップを。
Freeks(フリークス)
月額10,780円でJavaScript、Pythonなどのカリキュラムが学び放題。
質問し放題&転職サポート制度あり。
ウズウズカレッジ/CCNAコース用
月額33,000円(税込)〜インフラエンジニアの登竜門「CCNA」取得を目指す。
コース受講→転職成功で【実質全額無料】(最大240,000円)