なぜfoo()関数はundefined
をログに記録しますか? 最初のtext
変数はグローバル変数であるため、foo()
にアクセスできる必要があります。 var
文が宣言が関数の先頭に掲揚されconsole.log()
文の後であってもJavaScriptホイストとスコープ
var text = "outside";
function foo() {
console.log(text);
var text = "inside";
}
foo();
なぜfoo()関数はundefined
をログに記録しますか? 最初のtext
変数はグローバル変数であるため、foo()
にアクセスできる必要があります。 var
文が宣言が関数の先頭に掲揚されconsole.log()
文の後であってもJavaScriptホイストとスコープ
var text = "outside";
function foo() {
console.log(text);
var text = "inside";
}
foo();
。したがって、グローバル変数をシャドウするローカル変数を宣言します。しかし、初期化は、実際にステートメントに到達するまで発生しません。これはconsole.log()
ステートメントの後です。
だからあなたの機能は同等です:
function foo() {
var text;
console.log(text);
text = 'inside';
}
あなたがvar
宣言を使用しなかった場合、あなたはグローバル変数を使い続けるだろう、と再割り当てがconsole.log()
後まで起こらないでしょう。
私は、JavaScriptが実際にはホイストしないことに言及する価値があると思います。この動作は、実際にはコンパイルプロセスの最初のパスの結果です。結果として生じる動作は巻上と同じですが、技術的に言えば、実際には何も吊り上げることはありません。 – mhodges
@Barmar foo()関数からvarを削除すると、fooはテキストグローバル変数を使用することに注意してください。 – Feathercrown
@mhodgesこれとホイストの効果の違いは何ですか? – Barmar
テキストを返します。警告(foo()) –
@Jonaswはデバッグ文に 'alert'を使用しません。 –