JavaScriptの変数の宣言のvar/let/constの違いについてです。
| 確認環境 ・Windows10 ・Google Chrome |
目次
varとletとconstの違い
違いとして、スコープと値の再代入の可不可があります。
| スコープ | 変数に値を再代入 | |
|---|---|---|
| const | ブロックスコープ | 再代入できない |
| let | ブロックスコープ | 再代入できる |
| var | 関数スコープ | 再代入できる |
- constとletは、ブロックスコープです。ブロックとは、波括弧{ }で囲んだ箇所です。
- varは、関数スコープです。
- constは変数に値を再代入できません。
- letとvarは変数に値を再代入できます。
- constは、定数のときに使用します。また、varよりスコープが狭いので、再代入不可の変数で使用します。
- letもvarよりスコープが狭いので、再代入可の変数で使用します。
- letとconstはECMAScript 2015(ES6)で使用できるようになりました。
const
constのサンプルです。
<script>
{
// const k; //Uncaught SyntaxError: Missing initializer in const declaration
const k = 0;
// k = k + 3; //Uncaught TypeError: Assignment to constant variable.
console.log(k); //0
}
//console.log(k); // Uncaught ReferenceError: k is not defined
</script>
constは、変数の宣言のみの場合エラーになります。(3行目)
4行目は、constで変数を宣言し初期化しています。
6行目は、変数に値を再代入しようとしていますがエラーになります。
8行目は、ブロック内のため値は表示されます。
11行目は、ブロックの外のためエラーになります。
let
letのサンプルです。
<script>
{
let j = 0;
j = j + 3;
console.log(j); //3
}
//console.log(j); // Uncaught ReferenceError:j is not defined
</script>
3行目は、letで変数を宣言し初期化しています。変数の宣言だけでなく初期化までした方が良いです。
5行目は、変数に値を再代入しています。
7行目は、ブロック内のため値は表示されます。
10行目は、ブロックの外のためエラーになります。
var
varのサンプルです。
<script>
{
var i = 0;
i = i + 3;
console.log(i); //3
}
console.log(i); // 3
</script>
3行目は、varで変数を宣言し初期化しています。変数の宣言だけでなく初期化までした方が良いです。
5行目は、変数に値を再代入しています。
7行目は、ブロック内のため値は表示されます。
10行目は、ブロックの外ですが値は表示されます。
constの値を変更する
constは、再代入はできませんが、オブジェクトに格納された値の変更はできます。
<input type="text" id="input1" value="赤" maxlength="6">
<script>
const qs1 = document.querySelector("#input1");
qs1.value = "青"; //値の変更は可能
// qs1 = "a"; //Uncaught TypeError: Assignment to constant variable.
</script>
4行目は、querySelectorメソッドで1行目を取得しています。戻り値はElement オブジェクトです。
(変数qs1の値は、<input type="text" id="input1" value="赤" maxlength="6">です。)
6行目は、オブジェクトにあるvalueの値を赤から青に変更しています。
8行目は、値を再代入をしようとしていますがconstの制約でエラーになります。
strictモード
| 'use strict'; |
| "use strict"; |
- strictモードを使用する時は'use strict';または"use strict";と記述します。
- 変数の前にvar/let/constをつけずに、変数に値を代入すると、どこからでもアクセスできるグローバル変数になってしまうので注意が必要です。
strictモードであれば、変数の前にvar/let/constがない場合エラーにります。 - スクリプト全体を指定する場合は一番上に配置します。ただし非strictモードのスクリプトが存在しないことが前提です。
- 関数(function)内であれば一番上に配置します。
- 以下は、MDNのStrictモードのページです。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Strict_mode
コード
strictモードのサンプルです。
<script>
function test1(){
'use strict';
i = 2; //Uncaught ReferenceError: i is not defined
}
test1();
</script>
2行目は、strictモードにしています。
3行目は、変数の宣言をせずに値を代入しようとしているのでエラーになります。
関連の記事