BFE.devでのAI解答例 - JavaScript クイズ
32. Hoisting IIII
以下がこのJavaScriptコードの出力結果です:
function
number
number
string
number
解説:
-
var a = 1
はfunction a()
関数宣言よりも前で定義されているため、変数a
は関数定義の上書きによって関数オブジェクトに変換されます。そのため、typeof a
は'function'
ではなく'object'
になります。 -
b
は最初はvar b
で宣言されただけでした。function b()
はb = 1
の後に関数宣言として定義されたため、その影響はありません。そのため、typeof b
は'number'
になります。 -
var c
は宣言され、function c()
宣言よりも下に書かれました。そのため、var c
宣言は無視され、c
はfunction c()
宣言によって関数オブジェクトになります。それで、typeof c
は'function'
ではなく'number'
になります。 -
最初に
d
は1
に、そして無名の即時関数でd
は"2"
に変更されます。しかし、function d()
宣言によって関数が宣言されると、JavaScript エンジンは宣言された関数を既に含むスコープのトップにその関数を移動させます。それで、console.log(typeof d)
は"string"
ではなく"number"
となります。 -
const f = function e() {}
は、無名関数がe
という名前で作成されたことを意味します。しかし、e
の名前は関数スコープでのみ有効であり、外部スコープでは利用できません。つまり、typeof e
はundefined
ではなく、宣言されていないことになります。typeof e
にアクセスしようとすると、ReferenceError: e is not defined
エラーが発生します。typeof e
ではなくtypeof b
を印刷する行を追加すると、以下のようになります:var e = 1 const f = function e() {} console.log(typeof e) // "number"