巻き上げは、ここでの話の一部にすぎません。
まず、巻き上げについて説明します。
var
JavaScript プログラムで使用する場合は、変数を宣言します。その変数が JS スコープで宣言されている場合はいつでも、その変数はそのスコープの先頭に引き上げられます。JavaScript には Global または Function スコープしかありません。関数の場合
function hoistAway() {
console.log(a);
var a = 5;
}
と同等です
function hoistAway() {
var a;
console.log(a);
a = 5;
}
ご覧のとおり、宣言は引き上げられていますが、初期化はされていません。したがって、このコードはundefined
5 ではなくコンソールにログオンしa
ます。
を使用しない場合var
、宣言は明示的ではないため、巻き上げられません。したがって:
function hoistAway() {
console.log(a);
a = 5;
}
エラーメッセージが表示されます。
あなたの例では:
window.Foo = Foo;
Foo
宣言されていないため、エラーが発生します。
window.Foo = Foo;
Foo = function() {
...
};
繰り返しますが、Foo は宣言されていないため、巻き上げはありません。記録のために:
window.Foo = Foo;
var Foo = function() {
...
};
エラーをスローしません。ただ、宣言だけは掲げているので、こんなことをしたら
var bob = {};
bob.Foo = Foo;
var Foo = function() {
...
};
それならbob.Foo
そうでしょうundefined
。グローバル スコープではとが同じであるため、の特殊なケースwindow.Foo = Foo
は奇妙です。Foo
window.Foo
ついに:
window.Foo = Foo;
function Foo(){
...
};
関数宣言(関数式とは対照的に)も巻き上げられるため、機能します。名前と定義の両方が引き上げられるため、これは意図したとおりに機能します。