var (JavaScript)
読み:ばー
外語:var: variable
JavaScript
に3種類ある変数・定数宣言のうちの一つで、関数スコープまたはグローバルスコープの変数を宣言する。
目次
概要
構文
補足
省略可
動作
ブロックはスコープではなかった
概要
元々JavaScriptに存在した、再代入が可能な「
変数
」を定義するために使う宣言である。
しかし、後から追加された
let
と違い再宣言が可能で、なおかつスコープも
ブロックスコープ
ではなく
関数スコープ
(または
グローバルスコープ
)になるなど、バグを誘発する性質を持っている。
構文
var varname1 [= value1] [, varname2 [= value2] ... [, varnameN [= valueN]]];
カンマで区切って1行に複数の変数を宣言できる。また、それぞれで初期値の定義もできる。
補足
省略可
JavaScriptでは、varは省略できる。
var a = 1;
b = 1;
但し、省略すると必ず
グローバル変数
になる。関数内部で宣言されてもグローバル変数になるので注意が必要である。
動作
varは英語のvariableの略で、意味は文字通り「変数」である。
JavaScriptにおいてvarは、その現れる場所と無関係にコードが実行する前に生成される。これはHoisting(巻き上げ)と呼ばれる仕様で、つまりvarで宣言される変数はそのスコープ内なら宣言前でも使うことができることを意味する。しかも残念なことに、JavaScriptでは定義のみが巻き上げられ初期化は対象にならないため、実際の宣言前に変数を参照するとundefinedが返される。
varはJavaScriptの初期から存在したが、この仕様は問題が多く(というか、問題しかなく)バグも招くため、JavaScript 1.7およびECMAScript 2015 (ES6) から代替として
let
と
const
が追加され、こちらに移行できるようになった。
かくして、以降のJavaScriptにおいては、varは使わないことが望ましい。
ブロックはスコープではなかった
ブレンダン・アイク(Brendan Eich)により設計されたJavaScriptは、今となっては設計ミスだと言われるものも多々ある。その一つが、ブロックはスコープではない、という設計思想である。
変数は元々、varを付ければ関数スコープ、省略すればグローバルスコープとなるのが仕様である。関数内にブロックを書くことはできたが、ブロックスコープのための変数宣言は用意されず、つまりブロックはスコープではない、というのが元々のJavaScriptの設計思想だったわけである。
プログラムが小規模な範囲で収まっていればこれでも一種の制限として受け入れられたろうが、Webアプリケーションがどんどん大規模化するに従い、この仕様は問題でしかなかった。結果、ブレンダン・アイクが取れる解決策は一つしかなく、ブロックスコープで変数宣言をするための新しいキーワードを追加した。それが
let
である。
再検索