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"