1)これが警告する理由1
は、事前に関数を呼び出しているにもかかわらずtest()
、それ自体が独自のクロージャーを呼び出して作成し、そのvar example = 2;
内部で別のクロージャーを宣言しているためです。(したがって、アラートはそれを見ることができず、1つしか見えません)。もしそうなら: return example = 2;
alert(example) === 2 に気付くでしょう。これは、例をクロージャから取り出し、前の例の変数に影響を与えたためです。
example = 1;
function test(){
var example = 2;
}
test();
alert(example);
2)ここでは、関数内に新しい変数を作成していないため、(クロージャーを介して) 外部の変数の例にアクセスし、それを 2 に変更できます。
example = 1;
function test(){
example = 2;
}
test();
alert(example); //alert 2 no matter if example=1 or var example=1 before function
3)この最後の例は、「閉鎖」がここでどのように機能するかを示す良い例です。変数は、変数にアクセスしようとするものの上function ()
で宣言する必要があるとしましょう。一方、関数はそうではありません。だから、それ自体より下かもしれませんが、それは問題ではありません。重要なのは、 CALL toの前に宣言されていることです。これは、クロージャーが作成され、表示/アクセスできる変数などをラップするときです。var example = 1
function test() { }
test()
// so this ...
var example = 1;
function test(){
alert(example);
}
// and this work ...
function test(){
alert(example);
}
var example = 1; // <-- notice it's still above the test() func call, it can still see example
test(); //always alert 1, no matter if var example=1 or example=1 before function
// if var example = 1; was down here below it, it would alert "undefined", this is because
// the variable was not available within the scope when test() was called.