这称为闭包。执行此操作时,您正在设置一个名为i
. 因此,当您单击它时,您的click
函数会记住此变量,该变量始终为 2,因为它是循环结束时的值。
现在为什么它是一个全局变量?,因为javascript有函数范围而不是块范围
<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();
并且该变量不是全局对象。
注意:该功能不起作用,但说明了这一点。