2

此代码工作正常——单击第一个 (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) });
        }

为什么?提前致谢。抱歉,如果这是显而易见的事情,但这让我发疯。

4

4 回答 4

2

index()使用不需要for循环的 jQuery 方法要简单得多:

$('li').click(function(){ 
   /* "this " is element clicked*/       
    alert( $(this).index() );
});

不带参数使用index()将返回与其兄弟姐妹相关的元素索引。还有一些方法可以index()用于其他元素集合

API参考:http: //api.jquery.com/index

于 2013-01-26T22:33:52.730 回答
2

这称为闭包。执行此操作时,您正在设置一个名为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();并且该变量不是全局对象。

注意:该功能不起作用,但说明了这一点。

于 2013-01-26T22:36:29.640 回答
1

变量 i 是一个全局变量。在 for 循环之后,它的值为 2,每次单击任何 li 元素时,它都会提醒 i 的值,现在是 2。

尝试:

for (var i = 0; i < 2; i++) {
   $('li').eq(i).click(function() { 
         alert( $(this).index() ); 
    });        
}
于 2013-01-26T22:32:14.383 回答
0

闭包是个婊子:)你应该做这样的事情——这将捕捉到“正确的”我

function createAlertFunction(i) {
    return (function onClickFunc () {
        alert(i)
    });
}

for (var i = 0; i < 2; i++) {
    $("li").eq(i).click = createAlertFunction(i);
}
于 2013-01-26T22:34:28.080 回答