21

これは、javascript でスコープを学習しているときに見つけた興味深いものです。

コード

var foo = "This is a global variable.";

var bar = function() {
    alert(foo);
    foo = "Value has been modified";
}

bar();
alert(foo);

これにより、通常の応答が得られると思われますが、この 1 行を変更すると、次のようになります。

から:

foo = "Value has been modified";

に:

var foo = "Value has been modified";

foo の値が undefined になるのはなぜですか? 関数はグローバル スコープであるため、その前にvarキーワードを受け入れないのはなぜですか?

編集

これで基本的に、関数バーで何が起こっているかがvar キーワードのためにvar foo最も重要になり、引き上げられることを理解しましたが、割り当てられた値なしで引き上げられます。

4

3 に答える 3

14

ステートメントにはvar、実際の宣言の 2 つの部分があります。

var foo //;

...およびオプションの割り当て:

= 1234567890;

割り当てが行われていない場合、変数は (まだ定義されていない場合) デフォルトで になりundefinedます。


変数宣言部分は現在のスコープの先頭 (関数の先頭) に移動されますが、実際の割り当てには移動されません(したがって、次と同等です)。

var foo = "This is a global variable.";

var bar = function() {
    var foo; // undefined
    alert(foo); // yes, it's undefined
    foo = "Value has been modified"; // modify local, not global
}

bar();
alert(foo); // the global one

関数は独自のスコープを作成します。たとえば、次のようにします。

var test = function ()
{   var bar = 1;
    console.log(bar); // 1
};
test();
console.log(bar); // ReferenceError: bar is not defined
于 2013-10-28T01:10:22.967 に答える
4

を使用varすることで、エンジンにfoo という名前のローカル変数を使用するように指示し、グローバル変数をシャドウします。

で未定義になる理由alertは、使用varがその時点からだけでなく、スコープ全体に影響するためです。あなたは書くことができた:

var foo;
alert(foo);
foo = "Value has been modified";
于 2013-10-28T01:09:57.310 に答える