2012-03-02 219 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',而不會有任何問題。您不必創建新變量。