JavaScriptのvarはなぜ使わないほうが良いのか?―初心者エンジニアのためのやさしい理由解説
こんにちは。ゆうせいです。
JavaScriptの変数宣言には、次の3つのキーワードがありますよね。
var
let
const
でも最近のコードや教材を見ると、var
はほとんど見かけなくなってきました。
「var
って悪いの?」「let
やconst
と何が違うの?」という疑問を感じたことはありませんか?
この記事では、なぜ var
は使わないほうがいいのか? を、具体例・図解・比較表を交えて、やさしく解説していきます!
結論:var
は「危険な動きをすることが多く、バグの原因になりやすい」から!
最近では let
と const
を使うのが推奨されています。
では、なぜ var
は避けるべきなのでしょうか?
① スコープが「関数単位」で直感的でない
var
は「関数スコープ」
function test() {
if (true) {
var message = "こんにちは";
}
console.log(message); // → こんにちは(!?)
}
test();
let
と const
は「ブロックスコープ」
function test() {
if (true) {
let message = "こんにちは";
}
console.log(message); // → ReferenceError!
}
つまり、var
は if文やfor文の中で宣言しても、外に出てきてしまうんです。
これはスコープが“ゆるすぎる”という問題!
② 「巻き上げ(Hoisting)」によって予期せぬ動きをする
var
の変数は、宣言だけ先に処理される(初期化は後)
console.log(name); // → undefined(!?)
var name = "太郎";
このコード、エラーにはならず undefined
が表示されます。
理由は、「変数の宣言だけが先に巻き上げ(hoist)られる」ため。
実際の内部処理はこんな感じ:
var name; // 宣言だけ先にされる
console.log(name); // → undefined
name = "太郎";
このような仕組みがバグの原因になることがとても多いです。
③ 同じ変数名で再宣言できてしまう
var greeting = "こんにちは";
var greeting = "こんばんは"; // OK(でもこれ、意図してた?)
これは「上書きされてしまう」ので、変数の衝突やバグの温床になります。
let
や const
ではエラーになります:
let greeting = "こんにちは";
let greeting = "こんばんは"; // → SyntaxError!
④ ループと非同期処理で問題を起こす
var
だと、ループ変数が共有される
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1000);
}
// → 3, 3, 3(!?)
let
を使えば意図どおりに動く
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1000);
}
// → 0, 1, 2
var
だと、1つのi
を3つの関数が共有してしまうため、ループ後の値(3)になるんです。
比較表:var
, let
, const
特徴 | var | let | const |
---|---|---|---|
スコープ | 関数スコープ | ブロックスコープ | ブロックスコープ |
再宣言 | 可(バグの原因) | 不可 | 不可 |
再代入 | 可 | 可 | 不可 |
巻き上げ | あり(初期化なし) | あり(ただしTDZ) | あり(TDZ) |
安全性 | △(低) | ◎ | ◎ |
推奨されるか? | ❌ | ◎ | ◎(定数用) |
結論:今後はvar
を使わず、let
とconst
を使おう!
var
は古い書き方。意図しない動きをする可能性が高いlet
は変数、const
は定数に使い分ける- 基本は
const
を使い、再代入が必要なときだけlet
を使うのがベストプラクティス
今後の学習のヒント
次に進むなら、次のようなテーマがおすすめです!
- 巻き上げ(Hoisting)とTDZ(Temporal Dead Zone)
- JavaScriptのスコープチェーンとは?
- let/const/varの使い分けをマスターする練習問題
- モダンJavaScript(ES6以降)のベストプラクティス
var
を避けることで、予測しやすく安全なコードを書けるようになります。
迷ったらまずは const
、必要なときだけ let
を使う習慣をつけていきましょう!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
