此代码工作正常 - 单击第一个(li)产生“0”并单击第二个(li)产生“1”。
$("li").eq(0).click(function () { alert(0) });
$("li").eq(1).click(function () { alert(1) });
但是,我宁愿使用for循环。如下所示,每个(li)产生“2”。
for (var i = 0; i < 2; i++) {
$("li").eq(i).click(function () { alert(i) });
}
为什么呢?提前致谢。如果这是显而易见的事情,请道歉,但它让我发疯。
答案 0 :(得分:2)
使用jQuery index()
方法更简单,不需要for
循环:
$('li').click(function(){
/* "this " is element clicked*/
alert( $(this).index() );
});
使用不带参数的index()
将返回与其兄弟相关的元素索引。还有一些方法可以将index()
用于其他元素集合
答案 1 :(得分:2)
这叫做封闭。执行此操作时,您将设置一个名为i
的全局变量。因此,当您单击它时,您的click
函数会记住此变量,该变量始终为2,因为它是循环结束时的值。
现在为什么它是一个全局变量?,因为javascript具有函数scop而不是块作用域
<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>
Closure是一种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个素数并将它存储在一个可以为闭包访问的数组中,这样你就不必每次都要求函数计算nth号。
现在,有什么用呢?:你可以使用每次调用getPrimeNumber();
时都没有初始化的变量,而且这个变量不是全局对象。
注意:该功能不起作用,但说明了这一点。
答案 2 :(得分:1)
变量i是全局变量。在for循环之后,它的值为2,每次单击任何li元素时,它都会警告i的值,现在为2。
尝试:
for (var i = 0; i < 2; i++) {
$('li').eq(i).click(function() {
alert( $(this).index() );
});
}
答案 3 :(得分:0)
关闭是一个婊子:) 你应该做这样的事情 - 这将抓住&#34;正确的&#34;我
function createAlertFunction(i) {
return (function onClickFunc () {
alert(i)
});
}
for (var i = 0; i < 2; i++) {
$("li").eq(i).click = createAlertFunction(i);
}