2011-06-23 24 views
0

これはスコープと関係がありますが、私はいつもjavascriptスコープと闘うようです。とにかくここJavascriptカウンタがGoogleマップ関数に渡されない

は、マウスオーバーでコンソールの出力は常に3である

var beaches = [ 
     ['Surf Spot One', xxxxxx, xxxxxx, 2], 
     ['Surf Spot Two', xxxxxx, xxxxxx, 1], 
     ['Surf Spot Three', xxxxxx, xxxxxx, 3 ] 
    ]; 
    var marker = []; 
    for (var i = 0; i < beaches.length; i++) { 
     var pos = new google.maps.LatLng(beaches[i][1], beaches[i][2]); 
     marker[i] = new google.maps.Marker({ 
      setClickable: 1, 
      position: pos, 
      map: map, 
      icon: surferDude, 
      title:beaches[i][0] 
     }); 
     google.maps.event.addListener(marker[i], 'mouseover', function() { 
      // do something here on mouseover 
         console.log(i); 
      }); 
    } 

...コードのですか?どうしてこれなの?どのアイコンにマウスを重ねているかによって1または2または3になる必要があります。

答えて

1

はい、範囲についてです。コールバックが呼び出されると、リスナを追加するときにはiの値ではなく、最後の値がiになります。あなたが構築している匿名関数がそれを評価せずi変数をキャプチャ閉鎖され、コールバックが呼び出されるまで、iは評価されませんし、その時によって、iは解決策をつぶし3.

通常閉鎖されます動作するはずです:あなたはまた、別のcreate_listenerするのではなく、自己実行機能を使用することができますが、それはあまりにもうるさいかもしれない

function create_listener(i) { 
    return function() { 
     console.log(i); 
    }; 
} 
//... 
google.maps.event.addListener(marker[i], 'mouseover', create_listener(i)); 

+0

ありがとうございます。私は本当にjavascriptの範囲と闘う。 – 32423hjh32423

+0

@ neilc:クロージャーは慣れています。ループ内でクロージャーやコールバックを作成するときには、おそらく 'create_listener'のようなトリックが必要になることが一般的なルールです。あなたがそれを持っていないと主張している言語でさえ、ポインタから離れて決して得ることができない面白い方法:) –

関連する問題