varを使用すれば、新たに変数を宣言することができます。
しかし、全ての変数をvarで宣言してしまうと、後々に重大なバグを生み出してしまう可能性があります。
本記事では、変数の宣言で使われるvarに加え、同じくES6にて新たに追加されたlet及びconstについて解説します。
var
varは通常、このようにして変数を宣言可能です。
var greet = "Hello";
console.log(greet); // Hello
しかし、同名の変数が再宣言されることによって、想定した結果が得られないことがあります。
var greet = "Hello";
/* 省略 */
var greet = "こんにちは";
/* 省略 */
console.log(greet); // こんにちは
また、varはスコープ(変数の有効範囲)が関数全域に及びます。
var i = 30;
for(var i=0;i<10;i++){
console.log(i); // 0,1,2,3,4,5,6,7,8,9
}
console.log(i) // 10
末端のconsole.log()で30の出力を期待していたにもかかわらず10が出力されました。途中のforで再宣言されたiで値を変更させられ10になってしまったのです。
さらにvarは変数の巻き上げが起こります。
console.log(greet); // undefined
var greet = "Hello";
上記のコードは一見エラーになると思われますが、undefinedが出力され、エラーにはなりません。なぜなら、関数内でvarで宣言された変数は先頭にまとめて行われるからです。上記コードは下記と等価になります。
var greet;
console.log(greet); // undefined
greet = "Hello";
このようにvarには潜在的なバグを生み出す要素があります。
let
letはvarと違って再宣言ができない仕組みで、ブロックスコープになっており、巻き上げ問題もありません。ブロックとは{}で囲まれた部分の事を意味します。
let i = 30;
for(let i=0;i<10;i++){
console.log(i); // 0,1,2,3,4,5,6,7,8,9
}
console.log(i) // 30
ブロックスコープであるletではforで定義されたiとforの前に定義されたiはそれぞれ別物として扱われます。
const
constは編集不可能な定数を定義することができます。letと同様に再宣言は不可能でブロックスコープであり、再代入もできません。ただし、配列やオブジェクトに追加、編集をすることはできます。
const num_list = [1,2,3,4,5];
num_list.push(6);
num_list[0] = 0;
console.log(num_list); // 0,2,3,4,5,6
num_list = [7,8,9]; // Uncaught TypeError
JavaScriptの変数についてのまとめ
それぞれの違いをまとめるとこうなります。
| var | let | const | |
|---|---|---|---|
| 再宣言 | できる | できない | できない |
| 値の再代入 | できる | できる | できない |
| 巻き上げ問題 | あり | なし | なし |
| スコープ | 関数 | ブロック | ブロック |
| 主な用途 | 極力使わない | 再代入が必要な変数 | 再代入が不要な定数 |
varは変数の再宣言が可能であり、関数内であればどこからでも参照可能、なおかつ巻き上げが起こるなどの問題を抱えています。そのため、varを多用したコードを書いてしまうと、いずれは重大なバグを引き起こす可能性があるのです。
しかし、letとconstは使い分けやスコープなどの観点から扱いづらいものがあります。
varを使ったからと言って、直ちにバグが発生するという問題も無いため、初心者であるうちはvarを使用して徐々に慣れていくことも一考です。
また、ES6以前のコードではvarが使われていることがあるため『varが使用されている = 間違い』と考えるのは早計です。






コメント