2016-06-22 7 views
0

をループします。それは#yyボタンを押すとき.heads divの幅を増加し、#zzを押したときにそれを減少させる:は期待のように、次のコードが動作する

var q = ["#zz", "#yy"]; 
var c; 
$.each(q, function(key, value) 
{ 
    $(document).on('click', value, function() 
    { 
     c = (key == 0 ? -20 : 20); 
     $('.heads').css("width", $('.heads').width()+c); 
    }); 
}); 

私は以下のいずれかにコードを変更する場合しかし、それは両方のケースでの幅を増加します。ヘッド部門:

var q = ["#zz", "#yy"]; 
var c; 
$.each(q, function(key, value) 
{ 
    c = (key == 0 ? -20 : 20); 
    $(document).on('click', value, function() 
    { 
     $('.heads').css("width", $('.heads').width()+c); 
    }); 
}); 

質問:なぜですか? $ .eachループは両方のケースで2回実行され、cは最初の反復では-20、2番目の反復では+20です。しかし、私はそれが最後のコードブロックと最初のコードブロック内(期待通りに-20または20のいずれかで、両方のケースでは20だように見えます.on機能(c)にはconsole.log場合。

+0

論理的な問題は別として、ループは完全に冗長です。 '$(document).on(' click '、' #zz、#yy '、 fn); '要素の' data- * '属性に関連するメタデータを格納します。 –

+5

あなたは 'javascript closure'を意味していますか? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures –

+1

彼らは正しいです。それは閉鎖によるものです。 var cを削除すると、 2行目と5行目を "var c = ...."に更新すると、再び動作するはずです。 –

答えて

2

機能をonclickイベントに割り当てられたクロージャである。このような関数をループ内で作成されている場合、彼らはまだ同じ環境を共有しています。あなたのc変数は$.each()ループの外で宣言され、あなたの第二の例では、その値が常に同じである理由です。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures#Creating_closures_in_loops_A_common_mistake

+1

彼らは同じループを共有しているため、それはありません。あなたは 'for'ループを使う時を考えています。問題は、両ハンドラが同一の 'C'値を共有正しい範囲の外* * C 'が宣言されている 'ということです。 –

+0

あなたは完全に正しいです。 – KKKas

+0

私はC言語で、我々は、VAR cは参照によって渡され、二つの異なるVARS cはブライアンEutonが提案さの変化の中で宣言されていることを言うだろうと思います – Niels

関連する問題