- ベストアンサー
jQueryのforとeachの変数参照の違い
- jQueryのforとeachで変数参照をすると異なる結果になることについて説明してください。
- for文とeachメソッドでの変数参照の違いについて説明してください。
- jQueryのforとeachでの変数参照の違いについて解説してください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
01function A(){ 02 var x = 0; 03 04 function B(){ 05 var x = 2; 06 console.log(x); 07 } 08 09 function C(){ 10 console.log(x); 11 } 12 13 x = 1; 14 B(); 15 C(); 16 x = 3; 17 B(); 18 C(); 19} B/C関数を定義・・・4行目.9行目 B/C関数を実行・・・14行目.15行目.17行目.18行目 さて、各関数のxは何が表示されるでしょうか? B関数は、A関数のxとはB関数のxを使用します。 対してC関数はxの宣言が無いので、A関数のxを使用します。 その為 14行目のB関数は2を表示 15行目のC関数は1を表示(13行目で1を入れている) 17行目のB関数は2を表示 18行目のC関数は3を表示(16行目で3を入れている) これを理解したら、質問の内容に戻って(2)を少し分解してみましょう。 $(function){ function A(index, element){ var td=$(elem); function B1(){ td.css('background-color','red'); } function B2(){ td.css('background-color','');} td.mouseover(B1); td.mouseout(B2); } $('td').each(A); }; B1/B2関数のtdはA関数のtdが使われるのは理解できると思います。 A関数は$.each関数で何度も実行されますが、 B1/B2関数で使われるtdは各A関数が実行した時のtdなので、正しく動くわけです。 eachではなく、以下のようにA関数を実行したと考えると分かりやすいかもしれません。 var $td = $('td'); A(0, $td[0]); A(1, $td[1]);
その他の回答 (1)
- byDesign
- ベストアンサー率75% (45/60)
変数は関数の先頭で宣言されたものとして扱われます。 よって、(1)は以下と同等です。 $(function(){ var td; for(var i =0 ,len=$('td').length;i < len; i++){ td=$('td').eq(i); td.mouseover(function(){ td.css('background-color','red');}); td.mouseout(function(){ td.css('background-color','');}); } }); 問題の関数が実行される時、forループは回り後っているので、tdの中身は最後のtd そのため(1)はうまく動きません。 詳しく知りたい場合は、javascriptの変数スコープについて調べると良いです。
お礼
回答、ありがとうございます。 おしゃる通りで(1)のコードの結果は正しいというか、自分の理解に沿ったものになります。 しかし、理解できないのは(2)のコードの結果です。 イベント登録している変数tdとコールバックの関数式のtdとの結び付きはループ処理内では出来ていないと、認識しているのですが、何故か(2)では各セルでコールバック関数が反映しちゃてるんですよね。 ループ処理でもforとeachは結果が違う物なのでしょうか?
お礼
再度の回答と詳細な説明、ありがとうございます。 回答の読み初めで、変数のスコープは分かってるんだけどな…と生意気な事を思ってしまいましたが、その後の分解式で目から鱗が落ちました。 そうですよね、forは要素の数だけ処理を繰り返してるだけ、eachは関数の実行を繰り返してる。 今まではeachを使っても取得や設定だけで、jQueryで初めてeachによる関数の実行に触れたので、思い込みで視界が狭くなっていたと反省してます。 これで、先に進めます。 ありがとうございました。