まあ、それはかなり簡単です。関数を宣言したスコープ/コンテキストに応じて:
グローバルオブジェクト内:google.maps.event.addListener(trucks[data.results[i].id], 'click', checkData);
。これは、コールバックへの参照を渡すだけです。現在のスコープで見つからない場合、JSはグローバルオブジェクトを参照します。
他のオブジェクト:
google.maps.event.addListener(trucks[data.results[i].id], 'click', function(e)
{
someObj.checkData.apply(this,[e]);
});
最後のケースでは、イベントオブジェクトeが引数として渡されます。関数内はthis
、リスナーが接続されたクリックされた要素/要素を参照します。
編集
あなたは閉鎖を探しています、AFAIK:
google.maps.event.addListener(trucks[data.result[i].id],'click',function(e)
{
//this function will be called on each click, e is the event object:
checkData.apply(this,[e]);//more arguments? change [e] with: [e,arg2,arg3,...]
});
ただし、ローカルスコープからの引数を渡す必要がある場合は、クローザーがさらに意味をなし始めます。
var insideAfunction ='This string is local';
var anotherOne = {foo:'bar',so:'is this object'};
google.maps.event.addListener(trucks[data.result[i].id],'click',(function(local1,local2)
{
function(e)
{
checkData.apply(this,[e,insideAfunction,anotherOne]);
}
})(insideAfunction,anotherOne));
最後の場合のイベントハンドラーは無名関数であり、これは自己呼び出し関数の戻り値です。この自己呼び出し関数は、現在のスコープに対してローカルな2つの引数を受け取りました。
クロージャの優れている点は、これらの変数がコールバック関数にリンクされていることです。それらはガベージコレクションされないため、匿名のコールバック関数がそれらにアクセスしたり、関数に渡したりすることができますcheckData
。
クロージャ、少なくともここで使用されている方法を、現在のスコープ、その変数、およびそれぞれの値のスナップショットと考えてください。クロージャーが作成されたときの状態で凍結されました。最初は頭を丸めるのは少し難しいですが、ダグラス・クロックフォードはYouTubeにいくつかの動画を公開しており、そこで彼は閉鎖について語っています。それらを見ることをお勧めします。クロージャ、そしてJS全般で何ができるかに驚かれることでしょう。
Update2
私はあなたのコメントを読んだだけです、あなたが求めているもの(私は推測します)は次のようになります:
google.maps.event.addListener(trucks[data.results[i].id],'click',(function(mapObj)
{
//mapObj === trucks[data.results[i].id]
function(e)
{
checkData.apply(this,[mapObj]);
}
})(trucks[data.results[i].id]));
そして今、checkData
関数で:
function checkData()
{
//your snippet leads me to believe it usually doesn't get arguments passed
//as a callback, however, we're passing a google map object, access it like so:"
var passedObject = arguments[0];// === mapObj === trucks[data.results[i].id]
//safer, even:
var passedObject = arguments[0] || undefined;
if (passedObject instanceof Object)
{
alert('Called from event');
}
else
{
alert('called as a regular function');
}
}