2013-04-08 67 views
17

我有以下功能函數調用和函數引用有什麼區別?

function hello() { 
alert("hi!"); 
} 

拿這段代碼:

var elem = document.getElementById("btn"); 
elem.onclick = hello; 

我的問題可能會有點費解,所以忍耐一下: 究竟區分這一段代碼從一個正常的調用,或者是什麼使得這段代碼需要引用函數變量而不是常規調用? (hello();

我怎麼知道我應該在哪裏給函數的引用,以及何時我應該實際調用它?

+0

我可能是錯的,新的這些動態語言(剛開始看蟒蛇) ,但我認爲參考是當你想爲所述函數創建一個別名,並且當你想要調用時,調用就是字面意思。 (EG。'var = hello',那麼'var()'和調用'hello()'時調用var()'的地方是一樣的 – SGM1 2013-04-08 18:30:25

回答

23

那麼,onclick屬性需要一個函數的引用,以便在單擊元素時執行。通常,它要麼:

element.onclick = funcRef; 

element.onclick = function() { 
    funcRef(); 
}; 

(當然,最好使用addEventListenerattachEvent

注意如何他們兩個都是函數的引用,而不是打電話。

當某些事情需要引用時,您不要將其稱爲...您爲其分配引用(第一個示例)。

當你想專門調用一個函數時,你可以用()(第二個例子)來調用它。但請注意,在第二個示例中,仍然有一個對分配給onclick的函數的引用 - 它只是一個匿名函數。

也許更重要的部分:

有些人認爲要做到這一點:

element.onclick = funcRef(); 

但是,立即執行的功能(因爲()的),並賦予它的返回值到onclick。除非返回值一個函數,這不是你想要的。

我認爲這個故事的寓意是,當你想/現在需要某些東西來執行時,你可以調用這個函數。如果該功能需要以後使用或需要存儲,則不要調用它。

+3

**即時執行**位非常重要 – Wex 2013-04-08 18:33:28

+0

@Wex哈哈耶,我似乎在破壞它。試圖想想如何擴展它更多 – Ian 2013-04-08 18:33:57

+0

有一個有趣的角落情況:'element.onclick = getClickHandler()' – 2013-04-08 18:35:13

11

我怎麼知道我應該在哪裏給這個函數的引用,以及什麼時候我應該實際調用它?

您是否需要現在運行的功能?

不是添加的()來執行它

你需要的功能被引用所以它後來被稱爲?

不要添加()。

1

需要引用您的功能某處無論它如何被調用。這裏的區別在於你沒有明確地調用hello函數。您正在將該函數的引用分配給elem DOM節點的onclick事件處理函數,因此當爲該節點觸發onclick時,函數會被調用。

1

hello()表示您調用該函數,這意味着該函數將被直接執行。

而當您有elem.onclick = hello時,這稱爲回調。哪裏你沒有得到直接執行,但只有當某個事件被觸發時(在這種情況下,當有一個點擊元素)

15

你想要它現在執行?然後調用它。

a=hello()表示「儘快致電hello(),並將其返回值設置爲a」。

在另一方面,a=hello的意思是「ahello的別名。如果你打電話a(),你會得到相同的結果叫hello()

您使用後者回調等,要告訴瀏覽器事件發生後你想要發生什麼。例如,您可能想要說「當用戶點擊時請撥打hello()」(如示例中所示)。或者,「當AJAX查詢返回結果時,請在返回的數據上調用callback()函數」。

2

幾乎所有JavaScript語句都有返回值。除非另有說明,JavaScript中的函數在調用時將返回undefined。所以,它將使意義的唯一上下文來調用這個賦值語句的功能,如果它是返回一個函數:

function hello() { 
    return function() { 
     alert("hi!"); 
    } 
} 

elem.onclick = hello(); 
相關問題