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

目次

先日、とある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と同様の結果になる。

次に読むおすすめ記事

Vue3のベースプロジェクトを作成したので、仕上げにhuskyを導入する

Angularをバージョン指定でインストールする方法は?

JavaScriptでUnary plus (+)を使いかっこよくNumber型に変換する

今更ながら、即時関数がとでも便利でかっこいい

JavaScriptの配列で重複したものを削除し、ユニークな配列を作成する

この記事に対するコメント

お気軽にコメントを下さい

メールアドレスが公開されることはありません。 が付いている欄は必須項目です