これはクロージャと呼ばれます。これを行うときは、と呼ばれるグローバル変数を設定しますi
。したがって、クリックすると、click
関数はこの変数を記憶します。この変数は、ループの最後の値であるため、常に2です。
javascriptにはブロックスコープの代わりに関数scopがあるので、なぜそれはgloba変数なのですか?
<script type="text/javascript">
var imGlobal = "Hello!";
// ^ Watch out for the scope! I'm NOT inside a function
for (var i = 0; i < 2; i++){}
// ^ Watch out for the scope! I'm NOT inside a function EITHER!!!
function(){
// ^ Watch out for the scope! I'm inside a function
var imNOTGlobal = "I won't exist after the function has returned (under certain circumstances ;])";
}();
console.log(imGlobal); //"Hello!"
console.log(i); //2
console.log(imNOTGlobal); //undefined
</script>
クロージャは、次のような便利なことを行うJavaScriptの方法です。
// To get the nth prime number
var getPrimeNumber = function (){
var primeNumbers = [];
return function(n){
if(!primeNumbers[n]){
// Calculate the nth prime number and insert it into the array.
}
return primeNumbers[n];
};
}(); // The function is executed immediately
// making "var getPrimeNumber" to hold the result of the execution
// which is a function that remembers primeNumbers
// and is who does the actual calculation
getPrimeNumber(1);
getPrimeNumber(2);
getPrimeNumber(3); // Calculate it the first time
getPrimeNumber(4);
getPrimeNumber(3): // This is already calculated!
// The array ends up with 4 slots;
関数を呼び出すたびに、n番目の素数がすでに計算されているかどうかがチェックされ、クロージャにアクセスできる配列に格納されます。これにより、関数がn番目の数を求められるたびに計算する必要がなくなります。
さて、これについて何が役に立ちますか?:呼び出すたびに初期化されない変数を使用するようにgetPrimeNumber();
なり、この変数はグローバルオブジェクトではありません。
注:この機能は機能しませんが、要点を示しています。