2

このコードは正常に動作します。最初 (li) をクリックすると「0」が生成され、2 番目 (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

ループを必要としないjQueryindex()メソッドを使用する方がはるかに簡単です。for

$('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にはブロックスコープの代わりに関数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();なり、この変数はグローバルオブジェクトではありません。

注:この機能は機能しませんが、要点を示しています。

于 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 に答える