2012-03-02 136 views
0

我有一个函数,用于侦听屏幕上的单击并触发回调。这是一个辅助对象(这就是为什么在我的示例代码术语助手之前的一部分。当然,这是无关紧要的。将参数传递到回调函数

var Helper = { 
    bodyClickListener: function(fn) { 
     var window = document.getElementsByTagName('body')[0]; 
     window.click(); 
     CORE.dom.on(window, 'click', function(event) { 
      CORE.dom.off(window, 'click'); 
      fn(event); 
     }); 
    } 
} 

我需要能够给一个函数传入这个函数的参数已设置。

function someFunction() {  
    var popup = document.getElementById('tagResultsPopup'); 
    Helper.bodyClickListener(function(popup) { 
     return function(event) { 
      event.stopPropagation(); 
      removePopup(popup); 
     };    
    }(document.getElementById('tagResultsPopup'))); 

    function removePopup(element) { 
     if(element) { 
      element.parentNode.removeChild(element); 
     } 
    }; 
} 

上述工程的代码,但是你会发现,我不得不设置回调函数内弹出变量,它上面已经设置。我如何传递给一个参考先前的变量放入回调函数中

回答

0

答案就是以这种方式使用封闭:

Helper.bodyClickListener(function(popup) { 
    return function(event) { 
     event.stopPropagation(); 
     removePopup(popup); 
    };    
}(document.getElementById('tagResultsPopup'))); 

这样的回调函数可以访问我传入参数函数的变量。所以在这里,返回实际上是我作为回调传递的函数。

0

如果我正确理解你的问题,你不需要做太多。您可以使用外部定义的popup变量。

var popup = document.getElementById('tagResultsPopup'); 
Helper.bodyClickListener(function(event) { 
    event.stopPropagation(); 
    //Don't set it 
    //var popup = document.getElementById('tagResultsPopup'); 
    removePopup(popup);//popup will refer to the correct variable 
}); 
+0

我希望这是真的,但不幸的是它不工作。 bodyClickListener不驻留在与弹出变量相同的函数中。我只是调用函数并传递函数。 – ryandlf 2012-03-02 03:41:11

+0

@ryandlf这不是很清楚你的问题。那么你为什么不**然后再次获得元素的内容? – gideon 2012-03-02 03:44:38

+0

对不起,我想我很困惑你。 Helper.bodyClickListener与popup变量的功能相同,但Helper.bodyClickListener调用的实际函数位于Helper对象中。我不确定这与变量未被传递的原因有什么关系。 – ryandlf 2012-03-02 03:53:55

0

您传递给bodyClickListener的函数是闭包。您可以简单地在该函数内引用'popup',而不会有任何问题。您不必创建新变量。