No.235
【Javascript】変数のスコープ
Javascriptの変数スコープを簡潔に説明する
ES2015(ES6)で変数の宣言にlet
とconst
が追加された。
Starting with ES6, the version of the language finalised in 2015, variables can be declared with let (for a block level variable), var (for a function level variable) or const (for an immutable one). However, while the object assigned to a const cannot be changed, its properties can.
昔はvar
しかなかったので、古くからいじっている人ほど混乱している気がしないでもない。
というわけで説明用のテキストをメモ。
かなり私見が含まれているので要注意。自分はこれで困ってないけどね。
var
昔からある宣言。というか昔はこれしかなかった。
宣言する場所により「グローバルスコープ」もしくは「関数スコープ」になる。
関数の外で宣言すればグローバルスコープになる。
<script>
var hoge = 1;
function fuga() {
console.log(hoge)
hoge++;
console.log(hoge)
}
</script>
結果は
1
2
となる。 関数の中で宣言すれば関数スコープになる。foreachなどのブロックの中でも参照できる。
<script>
function fuga() {
var hoge = 1;
{
hoge++;
console.log(hoge)
}
console.log(hoge)
}
</script>
結果は
2
2
となる。
let
ブロックスコープになる。foreachなどのブロックの中では独立したものとして扱われる
一般的な処理ではlet
が多用されるものと思われる。
<script>
function fuga() {
let hoge = 1;
{
let hoge = 1;
hoge++;
console.log(hoge)
}
console.log(hoge)
}
</script>
結果は
2
1
となる。
const
letと同じでブロックスコープになる。
違いは再宣言や再代入できないこと。いわゆる定数と考えればOK。
<script>
function fuga() {
const hoge = 1;
console.log(hoge)
hoge++
}
</script>
結果は
1
Identifier 'hoge' has already been declared
となる。