# letの仕様に関する知識を問うJavaScriptの問題

3 min read
Table of Contents

先日、とあるSNSを見ていたら、JavaScriptの問題が出されていた。

さて、ここで問題

let a = 10
if(true) {
let a = 20
console.log(a, 'inside')
}
console.log(a, 'outside')
// Q. What is the output of thie below code?
// 1. 20, 'inside' and 20, 'output
// 2. 20, 'inside' and 10, 'output
// 3. 10, 'inside' and 10, 'output
// 4. 10, 'inside' and 20, 'output

このコードを実行した結果、どのような結果が求められるでしょう。

予想

面白そうなので実行する前に推測してみる。 まず、If文trueなので当然のようにIfの中身が実行される。 ここでLetの仕様の話になるのだが、Letは関数内でスコープされるので、先頭で定義されたLetIf文の中のLetは違うものだということになる。

結果、If文の中のa20となり、outsideaはどこからも影響を受けずに10のままになる。

つまり2が正解になると予想される。

結果

[LOG]: 20, "inside"
[LOG]: 10, "outside"

正しいと証明された。

たぶん予想の仮説も正しいが、念のためChat Gptに聞いてみる。

このコードの出力は、以下のようになります:
20, 'inside' and 10, 'output
理由は次のとおりです:
最初の行で、変数 a に値 10 を代入します。
次に、if 文の中に入りますが、条件式は true なので、ブロック内のコードが実行されます。
ブロック内で、変数 a に値 20 を代入します。これは新しいスコープ内で宣言されたローカル変数です。
console.log(a, 'inside') を実行すると、20, 'inside' が出力されます。
if 文のブロックを抜けると、元のスコープに戻ります。
console.log(a, 'outside') を実行すると、10, 'outside' が出力されます。これは、最初に宣言されたグローバル変数 a の値が表示されています。
したがって、最終的な出力は 20, 'inside' と 10, 'outside' になります。

うん、同じことを言っているので一安心した。

Var or Const

Var

ちなみにVarで定義すると、aが毎回上書きされるので、

[LOG]: 20, "inside"
[LOG]: 20, "outside"

になる。

Const

ConstLetと同様の結果になる。

My avatar

Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.


More Posts

Comments