誰かが、以下の2つのコードスニペットが異なる結果を印刷する理由を説明できますか?ホイストと可変スコープ
違いは条件文の中にあります。最初は、名前に「Jack」というローカル変数が割り当てられています。条件はtrueyです(nameはtrueに評価されます)。 2つ目は、同じ名前の 'Jack'がグローバル変数名に割り当てられますが、条件はfalsyです(!nameはfalseです)。私の質問は、他のすべてが同じである場合、なぜ変更されたものがの中にある場合、最初の条件が真で2番目が偽であるのですか?条件付きのボディ?
私の唯一の説明は、それが最終的にname
は、変数の宣言を掲揚する必要があるかどうかにかかわらず、ローカル/グローバルであるかどうかを判断し、どのようにしている、条件付きの本体はJSインタプリタ最初によって読み取られていることです異なる名前の値が記録されます。
本体の解釈を開始する前に条件付き論理値を最初に評価してはいけませんか?両方の場合、変数 'name'は 'undefined'と評価されます...どんな助けでも大歓迎です!
ホイスト/スコープのコンテキストについては、本当に良いリソースがいくつかありますが、この質問に具体的に答えるものは見つかりません。あなたがvar
を使用する場合
http://javascriptissexy.com/javascript-variable-scope-and-hoisting-explained/
var name = "Paul";
function users() {
if (!name) {
var name = "Jack"; //<== difference is here, *inside* conditional body
}
console.log(name);
}
users(); //outputs "Jack"
対
var name = "Paul";
function users() {
if (!name) {
name = "Jack"; //<== difference is here, *inside* conditional body
}
console.log(name);
}
users(); //outputs "Paul"
あるケースでは、ローカル変数があり、もう一方にはローカル変数がありません。なぜ結果は同じでしょうか? – Bergi
@Bergiホイスト変数宣言が条件付きのロジックを変更しなかった場合、戻り値は同じになります。 –
* "どちらの場合でも変数 'name'は 'undefined'として評価されるべきではありません" * Uh no? 2番目の例では、 'name'はローカル変数ではありません。これは '' Paul "'という値を持つグローバル変数を参照します。ホイストは変数宣言にのみ適用されます。 2番目の例の関数内には変数宣言はありません。 –