2016-01-05 71 views
1

我正在教自己使用JavaScript編寫代碼,其中一個讓我興奮的事情是能夠創建自定義(較短)版本的addEventListener。爲什麼我的addEvent函數需要自我調用?

我有以下代碼:

var onEvent = function() { 
return function(obj, event, fn) { 
    obj.addEventListener(event, fn, false); 
}; 
}(); 

onEvent(input,"keypress", pressedEnter); 

(我自己個人使用,我更喜歡用「當」,而不是「的onEvent」

研究後,我想我明白,加入() ??在函數結束運行時,它可是爲什麼這是必要的不會的功能,只要它添加到被點擊的對象運行

同樣,我創建了一個更短的getElementById:

function grab(id) { 
return document.getElementById(id); 
} 

爲什麼在使用前不需要自行運行?我誤解了結尾括號的目的嗎?

謝謝。

+1

第一位代碼中立即調用的函數沒有意義。 – Pointy

+0

如果我刪除括號它不會工作。 – codemon

+2

刪除整個周圍的匿名函數。讓它看起來像你的'grab()'函數。它是如何得到原來的樣子的? – Pointy

回答

2
var onEvent = function(obj, event, fn) { 
    obj.addEventListener(event, fn, false); 
}; 

應該完全一樣。

+0

好吧,我的錯,這是不工作,當我嘗試,但這是有關的另一個錯誤,所以你是對的,它的工作原理就像好,謝謝!然而,是否有一個原因代碼是由Dustin Diaz在這裏顯示括號:http://www.dustindiaz.com/javascript-no-no/ – codemon

+0

是的,你可以在他的代碼中看到他有一個if-聲明他檢查addEventListener是否存在。所以基本上他正在檢查瀏覽器是否支持addEventListener,並在不存在的情況下返回另一個函數。 – jfornoff

+0

是的,我注意到,爲了我自己的清晰度,我剝離了if語句來處理attachevent,因爲它所針對的ie版本幾乎與我無關。但爲什麼if語句需要結束括號?它基本上是這樣做的:var addEvent = function(){}(); – codemon

0

您的外部annonymous(不帶名稱)函數用於定義並返回一個內部函數。

如果您需要在本地環境中執行此操作,那麼這很有意義。即如果你想定義只在外部和內部函數中可見但不在外部函數外部的私有變量。或者,你可能想要在use "strict"裏面的外部函數。

如果內部函數的創建取決於上下文,它也會有意義。然後,也許你想根據上下文信息返回不同的功能。

相關問題