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
から戻った後に生き残った場合のように、関数よりも長く存続する可能性があります。f
g