Javascript 如何从另一个作用域中的函数调用事件侦听器?

Javascript 如何从另一个作用域中的函数调用事件侦听器?,javascript,google-maps,google-maps-api-3,onclick,dom-events,Javascript,Google Maps,Google Maps Api 3,Onclick,Dom Events,我想调用一个Google事件侦听器,如下所示: google.maps.event.addListener(trucks[data.results[i].id], 'click', function() { // Do the magic :) } function checkData(){} google.maps.event.addListener(trucks[data.results[i].id],'click',(function(mapObj) { //mapObj =

我想调用一个Google事件侦听器,如下所示:

google.maps.event.addListener(trucks[data.results[i].id], 'click', function() 
{
// Do the magic :)
}
function checkData(){}
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]));
从未在同一范围内定义的函数:

功能如下:

google.maps.event.addListener(trucks[data.results[i].id], 'click', function() 
{
// Do the magic :)
}
function checkData(){}
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]));
我该怎么做?我是否可以以某种方式发送值,使其与单击值相同?我的意思是它需要在点击事件上工作,但我想把它称为正常的

编辑: 让我更具体地说:

我们有类似于:

function initialize()
{
google.maps.event.addListener(trucks[data.results[i].id], 'click', function() {};
}
在不同的范围内

function checkData()
{
   for (var i = 0; i < window.data.results.length; i++) 
   {
     if(window.data.results[i].driver_id==selectedIndex) 
     {
       // I want to sent the founded object to the event handler in this particular time

     }
   }

}
函数checkData()
{
对于(var i=0;i
我需要在checkData中放入什么来在特定时间将其称为事件处理程序?如何将值传递给它?或者我需要将值传递给它吗?

修改后的答案:

google.maps.event
命名空间包含一个方法。您可以使用此方法模拟(例如)对象上的单击事件。您确实需要对该对象的引用

修改后的答案:

google.maps.event
命名空间包含一个方法。您可以使用此方法模拟(例如)对象上的单击事件。您确实需要对该对象的引用


嗯,那很容易。根据声明函数的范围/上下文:

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');
    }
}
在全局对象中:
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将作为参数传递。在函数
中,此
将引用连接侦听器的已单击元素

编辑

你在找一个了结,阿福:

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));
在最后一种情况下,事件处理程序是匿名函数,即自调用函数的返回值。这个自调用函数接收到两个参数,它们是当前作用域的本地参数
闭包的好处在于,这些变量链接到回调函数。它们不是垃圾收集的,因此匿名回调函数可以访问它们,甚至可以将它们传递给
checkData
函数

将闭包(至少在这里使用闭包的方式)看作当前范围、其变量及其各自值的快照。在创建闭包时处于冻结状态。一开始想让你的头脑清醒起来有点棘手,但道格拉斯·克罗克福德在youtube上有几段视频,他在视频中谈到了闭包。我建议你看他们。您会惊讶于使用闭包和JS所能做的一切

更新2

我刚刚读了你的评论,你想要的(我想)是这样的:

google.maps.event.addListener(trucks[data.results[i].id], 'click', function() 
{
// Do the magic :)
}
function checkData(){}
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');
    }
}

嗯,那很容易。根据声明函数的范围/上下文:

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');
    }
}
在全局对象中:
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将作为参数传递。在函数
中,此
将引用连接侦听器的已单击元素

编辑

你在找一个了结,阿福:

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));
在最后一种情况下,事件处理程序是匿名函数,即自调用函数的返回值。这个自调用函数接收到两个参数,它们是当前作用域的本地参数
闭包的好处在于,这些变量链接到回调函数。它们不是垃圾收集的,因此匿名回调函数可以访问它们,甚至可以将它们传递给
checkData
函数

将闭包(至少在这里使用闭包的方式)看作当前范围、其变量及其各自值的快照。在创建闭包时处于冻结状态。一开始想让你的头脑清醒起来有点棘手,但道格拉斯·克罗克福德在youtube上有几段视频,他在视频中谈到了闭包。我建议你看他们。您会惊讶于使用闭包和JS所能做的一切

更新2

我刚刚读了你的评论,你想要的(我想)是这样的:

google.maps.event.addListener(trucks[data.results[i].id], 'click', function() 
{
// Do the magic :)
}
function checkData(){}
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');
    }
}

checkData是在全局范围内定义的,而event listener不是。如果它是全局的,那么event listener仍然可以访问它。这不是问题,JS返回到全局上下文。唯一的问题可能是名称冲突:如果您正在使用的作用域中存在同名函数,则应明确作用域:
窗口。checkData
@denon:请参阅修订后的答案;我不确定它是否有用。OMG就是这样:)一行代码,它就像一个符咒一样工作:)thumb up mancheckData是在全局范围内定义的,而event listener不是。如果它是全局的,那么event listener仍然可以访问它。这不是问题,JS返回到全局上下文。唯一的问题可能是名称冲突:如果您正在使用的作用域中存在同名函数,则应明确作用域:
窗口。checkData
@denon:请参阅修订后的答案;我不确定它是否有用。天哪,就是这样:)一行代码,它就像一个符咒一样工作:)竖起大拇指的人