0

Googleマップイベントにリスナーを追加したいのですが、匿名関数ではなく名前付きの外部関数を使用します。これはループ内で発生するため、匿名関数をすぐに定義したくありませんが、代わりに名前付きの外部関数を使用します。

いいえ:

for (...) {
    googleMap.event.addListener(instance, eventName, function() {...});
}

しかし、むしろsth。お気に入り:

doSomething = function(parameter1, parameter2...) {
    ...
}

for (...) {
    googleMap.event.addListener(instance, eventName, params, doSomething);
}

「インスタンス」がGoogleマップマーカーの場合、を使用してパラメーターをマーカーに追加し、をmarker.set(paramName, paramValue)介してイベントハンドラー関数内のパラメーターにアクセスできますが、イベントハンドラー関数this.paramNameに値を渡す方法は他にありますか?匿名のものを使いたくないですか?

どんなアドバイスでも大歓迎です、ローマン。

4

2 に答える 2

3

私も同じ問題を抱えていました。これが解決策です。here で説明されているパターンを使用することにより、ループの問題で create 関数を真に回避します

JavaScript で、ループ内で関数を作成すると計算が無駄になる具体的な理由は何ですか?

私はこれを「関数ファクトリー」パターンと呼んでいます。

その他の要素は、関数内の「this」が関数を発生させたオブジェクト (クリックされた地図上のものなど) を参照し、JavaScript は完全に動的であるため、追加のプロパティを自由に追加できることです。関数内で this.blah を呼び出してクエリを実行します。

function doSomethingHandlerFactory(){
var f = function(event){
    //do something, for example call a method on a property we attached to the object which raised the event
    this.blah.clicked(event);
};
return f;
}

//add a property to the google overlay object (for example a polyline which we've already set up)
thePolyline.blah = ...;

//get a handle for a function, attach the event (in this case to a polyline), and keep  
//a reference to the event (in case we want to call removeListener later).  The latter
//is optional.
var f = doSomethingHandlerFactory();
var ev = google.maps.event.addListener(thePolyline, 'click', f);

これが誰かを助けることを願っています。

于 2013-11-10T00:01:00.513 に答える
1

名前付き関数を匿名関数でラップするのはどうですか:

google.maps.event.addListener(instance, eventName, function() { doSomething(parameter1, parameter2,...) });
于 2013-03-30T14:28:33.067 に答える