2012-03-09 101 views
7

我在試圖拼湊一個有點動態的Google地圖顯示時遇到了一些奇怪的問題。點擊時,我在地圖上覆蓋了一個我想調用的函數。最初,我擁有了一切硬編碼,所以我不得不爲每個疊加這樣的功能:如何在不立即運行的情況下將參數傳遞給函數?

google.maps.event.addListener(southEast, 'click', showSouth); 
function showSouth() { 
    // do stuff 
} 

這個工作沒有問題,但後來我做了整個頁面更動態的,所以我決定做一個函數,將通過一個ID然後根據這個顯示,這就是我原本應該設置的。我改變了代碼,看上去就像這樣:

google.maps.event.addListener(southEast, 'click', showArea(1)); 
function showArea(id) { 
    // do stuff based on that id 
} 

功能工作,但問題是,它立即調用頁面加載。經過研究,我瞭解到,當您使用圓括號調用函數時,該函數將立即調用,然後返回值被引用。 source

因此,現在我有點卡住瞭如何將該ID傳遞給函數而不立即調用該函數。我發現一些這樣做的hacky方式可能工作,但我覺得這不應該是我必須一起破解的東西...

回答

13

showArea返回一個函數,與id一起工作。

function showArea(id) { 
    return function() { 
     // do stuff with id 
    }; 
} 

返回的函數關閉超過id因此它繼續引用它,並且被傳遞到addListener用作該處理程序。


或者,你可以只內嵌調用showArea(1)功能...

google.maps.event.addListener(southEast, 'click', function() { showArea(1); }); 
function showArea(id) { 
    // do stuff based on that id 
} 

這工作,因爲你硬編碼1。如果它是一個可以改變的變量,就像在一個循環中一樣,你會使用第一個例子。

+0

兩者都像魅力一樣工作。非常感謝! – 2012-03-09 18:04:38

+0

@MattMcClure:不客氣。 – 2012-03-09 18:14:12

+0

謝謝@squint!返回函數解決了我在初始化階段執行函數的調用問題,而不是在執行階段。 – 2016-10-27 14:54:08

相關問題