3

NodeJSで実行している.jsファイルがあります。これが私のファイルの内容です:

var ctry = "America";

function outer(msg) {
    console.log(msg + " " + ctry) ;
    var ctry = "Canada" ;
}
outer("God Bless");

このファイルを実行すると、「God Bless America」が表示されるはずですが、代わりに「GodBlessundefined」が表示されます。

内側のvarctry=行をコメントアウトすると、「God Bless America」が表示され、内側のvar ctry =行をconsole.logの上に移動すると、「GodBlessCanada」が表示されます。これらの最後の2つのケースは論理的に見えますが、console.logの後にvar ctryを定義すると、上記のコードでctryがアンダーファインに設定されるのはなぜですか?

4

2 に答える 2

5

ローカル変数のスコープ(ctryあなたの場合)は、それが宣言されている関数全体です(つまり、変数が関数の先頭で宣言されているかのように)。上記のコードは、意味的に次のコードと同じです。

function outer(msg) {
    var ctry ;
    console.log(msg + " " + ctry) ;
    ctry = "Canada" ;
}

undefined出力に入る理由が明らかになったはずです。

于 2012-07-17T22:14:53.070 に答える
2

関数内で言うとvar ctry(関数内であればどこでもかまいません)、ctry関数内で行われた呼び出し (ここでも、どこでもかまいません) は内部変数ではなく内部変数を参照します。グローバルなもの。問題は、JS インタープリターは変数の定義のみを認識し、その行を実行するまで値 (Canada) で変数を初期化しないため、console.logまだ定義されていないことです。

于 2012-07-17T22:17:11.227 に答える