function myFunction() {
let x = 'hello'
const y = 'hello'
var z = 'hello'
if (x === 'hello') {
let x = 'World'
const y = 'World'
var z = 'World'
console.log('let x=', x) // Prints 'world'
console.log('const y=', y)// Prints 'world'
console.log('var z=', z)// Prints 'world'
}
console.log('let x=', x) // Prints 'hello'
console.log('const y=', y) // Prints 'hello' console.log('var z=', z) // Prints 'world'
}
let, const の有効範囲はブロック内です。5行目からのif文のブロックの中では、6,7行目で変数の宣言と代入がされている 'world' が出力されます。
一方、var で定義した変数 xは、15行目のログ出力で 'world'
と出力されます。これは var 変数は同一関数内で有効であり、かつ次に説明する再宣言ができるので、console.log が実行される直前(11行目)に宣言と代入がされた変数の値が出力されます。
関数で定義した変数はif, for のブロック内でも使える
上位のブロックで let, const で宣言された変数は、下位のブロックでも参照できます。
下記の例で説明します。
function checkScope() {
let x = 0
if (x==0) {
let y = 0
for (let i=0; i<10; i++) {
x = x + 1
y = y + 1
}
console.log('y=', y)
}
console.log('x=', x)
}
変数 x は、checkScope()
関数で定義しているので、下位ブロックのif文、さらにその下位にあたる
forループでも参照することができます。なので、x=x+1
が10回実行され、forループ、if文を抜けたあとのログ出力で x=10
と出力することができます。
変数 y
は、if文の中で宣言されているので、下位ブロックのforループで参照することができます。forループでの処理で再代入された値が、if文内のログ出力で可能です。
しかし、if文を出た後にログ出力をしようとすると y
は定義されていないとエラーとなります。
function checkScope() {
let x = 0
if (x==0) {
let y = 0
for (let i=0; i<10; i++) {
x = x + 1
y = y + 1
}
console.log('y=', y)
}
console.log('x=', x)
console.log('y=', y)
}
また forループで使っている変数 i も let で定義しているので
forループ内だけで有効です。これを for (var i=0; ....) とすると、変数 i
は、関数内で参照できる変数となります。
また 変数 i を宣言するときに、let,
var のキーワードを付けないと(忘れると)、変数 i
は、グローバル変数となり、変数が宣言された以降に実行されるどの関数でもアクセスできるようになってしまいます。
function checkScope() {
let x = 0
if (x==0) {
let y = 0
for (i=0; i<10; i++) {
x = x + 1
y = y + 1
}
console.log('y=', y)
}
console.log('x=', x)
print()
}
function print() {
console.log('i=', i)
}
再宣言
変数のスコープで
var
の再宣言についてふれましたが、もう少し簡単な例で説明します。下記のように
var は、同じ関数内で何度でも宣言できます。
function redeclaration() {
var x = 1
x = x + 1
console.log('x=', x)
var x = 'Hello'
console.log('x=', x)
}
let,
const
は同一ブロック内では1回しか宣言できません。下記のプログラムは構文エラーとなり保存できません。
function test() {
let x = 1
x = x + 1
console.log('x=', x)
let x = 'Hello'
console.log('x=', x)
}