1

重複の可能性:
Javascript の変数スコープに混乱している

たとえば、これは私の JavaScript コードです。

var foo = 'Originalvalue';
var foo = 'Nextvalue';
alert(foo); // Nextvalue

それでvar、すでに宣言された変数の前に書くことは単に無効化され、プログラムには役に立たないと確信しています。

しかし、次のプログラムを考えてみましょう:

var foo = 'Originalvalue';
function duhfoo() {
  var foo = 'Newbievalue';
}
duhfoo();
alert(foo); // Originalvalue

次に、最初の例で説明したロジックから、値は 'Originalvalue' である必要があります。これは、 という変数が既に存在するためですfoo。では、なぜそうなのか。

4

3 に答える 3

2

なぜなら

MDNから)

varには次のプロパティがあります

  • 関数スコープ
  • その機能のトップにホイスト
  • 同じスコープ内の同じ名前の再宣言はノーオペレーションです

この主題の詳細については、これをお読みください。

于 2012-09-27T05:29:57.727 に答える
2

Javascript には、ローカル変数とグローバル変数の 2 種類の変数があります。

関数の外で使用する場合、グローバルvar変数を宣言していますが、まったく使用しない場合も同じことが起こります。書き込みvar

foo = "first";

at top level (任意の関数の外) は と同じvar foo = "first"です。

ただし、関数内では状況が異なり、キーワードはローカル変数とグローバル変数をvar区別します。

var foo = "first";
var bar = "second";

function f()
{
    var foo = "third"; // local
    bar = "fourth";    // global
}

f();
alert([foo, bar]); // output will be first,fourth

つまりvar、関数内で使用すると、変数は同じ名前の別のものになり、関数の境界内に記述されたコードによってのみ表示されます。

境界はブレースではなく、関数によって決定されることに注意してください{...}。ネストされたブロックがありvar、ブロック内で別の宣言を使用すると、変数は同じになり、これは Java、C、または C++ などの他の言語で起こることとは異なります。

スコープを作成する唯一の方法は、関数 (関数内の関数を含む) を定義することです。

Javascript で覚えておくべきもう 1 つの非常に重要なこと (特に、この概念が存在しない Java、C、または C++ などの似たような言語にさらされた場合) は、「キャプチャ」/「クロージャ」の考え方です...

var foo = "first";

function f()
{
    // Local variable
    var foo = "second";

    function g()
    {
        // This is the local foo of f, not the global
        // one even if there is no "var" declaration
        // inside this nested scope
        return foo;
    }

    return g;
}

var nested_function = f();

alert([foo, nested_function()]); // output will be first,second

基本的に、ローカル変数は、その変数を「キャプチャ」すると言われる他の関数によって使用されることにより、それを定義した関数よりも「存続」できます。1 つ以上の変数をキャプチャする関数は「クロージャ」と呼ばれます。

つまり、ローカル変数は関数の本体内でのみ表示されますが、最後の例のローカルで発生したように、変数がクロージャーによってキャプチャされたため、fooから戻った後に生き残った場合のように、関数よりも長く存続する可能性があります。fg

于 2012-09-27T05:37:33.950 に答える
2

duhfoo 内の変数 foo は、そのスコープが duhfoo() メソッドであり、グローバルではないことを明確に示しています。

于 2012-09-27T05:27:28.453 に答える