2011-11-22 92 views
2

在下面的代碼中,我試圖在用戶單擊文檔時顯示警報。正如我使用圓括號做了doAlert(),代碼在文檔加載並警告事件發生,但如果我這樣做只是此javascript代碼有什麼問題

doAlert

看來,當我點擊該文件作出迴應。那麼,我是否應該在沒有括號的情況下調用javascript中的函數,或者這樣做的想法是什麼。如果我要將參數傳遞給函數,該怎麼辦?

<!doctype html> 
    <html> 
    <head> 
    <script> 
    function doAlert(){ 
     alert("Hello"); 
    } 
    function init(){ 
     document.onclick = doAlert(); 
    } 
    window.onload = init(); 
    </script> 
    </head> 
    <body> 

</body> 
</html> 

回答

5

當你調用一個函數,你會得到它的返回值。

window.onload = init(); 

這將運行init()並設置window.onload到它的返回值,undefined

您需要設置這樣的:

window.onload = init; 

現在window.onload設置爲功能init,它不會運行,直到需要。

如果你想在你的onClick傳遞參數,比如,你可以做這樣的:

document.onclick = function(){ 
    doAlert('Clicked'); 
}; 

這臺onClick一個匿名函數,調用你想要的功能。或者,你可以使用閉包:

function doAlert(param){ 
    return function(){ 
    alert(param); 
    }; 
}; 

document.onClick = doAlert('Hello World'); 

doAlert叫,onClick設定它的返回值,這是一個函數(在這種情況下,一個警報'Hello World')。

+1

好的解釋...現在很清楚。當我爲事件設置功能時,我正在調用函數。很有幫助。謝謝 – Sandeep

+0

@瘋狂-36:沒問題。 JavaScript中的函數可以視爲變量,這很奇怪。這是因爲'function a(){}'和'var a = function(){}'是一樣的。 –

8

如果foo是一個函數,然後bar = foo將這個函數賦值給變量bar,但bar = foo()立即通話功能及其返回值分配給bar代替。

事件處理程序通過提供將在事件發生時將被調用的函數來工作。如果立即運行函數,那麼它的返回值需要是事件發生時要運行的函數(在這種情況下,doAlertinit的返回值是undefined)。

+0

Quentin有它的權利,你的代碼正在執行調用該函數,而不是分配它作爲處理程序。 –

+0

更容易理解,但糾結了我...謝謝 – Sandeep

7

document.onclick被設置爲doAlert的而不是doAlert功能本身。

您的代碼應該是這樣的:在Javascript

<!doctype html> 
    <html> 
    <head> 
    <script> 
    function doAlert(){ 
     alert("Hello"); 
    } 
    function init(){ 
     document.onclick = doAlert; 
    } 
    window.onload = init; 
    </script> 
    </head> 
    <body> 

</body> 
</html> 
4

函數是對象,並且可以沿着任何其他變量的傳遞。在你的情況下,doAlert只是一個函數的引用。爲了調用此引用指向的函數,您需要使用括號:doAlert()

document.onclick方法應該是一個函數引用,所以你給它分配一個函數引用,如下所示:document.onclick = doAlert。使用您的語法,您將呼叫的結果分配給doAlert()document.onclick,這是不正確的。

Got it? :)

+0

謝謝,現在明白了... – Sandeep