2016-08-26 3 views
-1

Warum muss ich () nicht verwenden, um eine Funktion innerhalb einer 'for' Schleife oder innerhalb einer '.addEventListener()' Methode aufzurufen? Zum Beispiel:Aufruf von Funktionen innerhalb von Schleifen und Methoden nicht erforderlich()?

function activitiesReset() 
    {activitiesLegend.style = ''; 
} 

for (var i=0; i<checkboxes.length; i++) { 
    checkboxes[i].addEventListener('change', activitiesReset); 
} 

Im addEventListener Methode habe ich versucht, zuerst meine Funktion wie activitiesReset() nennen, aber das hat nicht funktioniert. Entfernen der () vom Ende der Funktion funktionierte.

Warum ist das?

Antwort

5

checkboxes[i].addEventListener('change', activitiesReset) ruft nicht activitiesReset. Es wird activitiesReset als Argument übergeben. activitiesReset ist eine Funktion selbst; activitiesReset() ist ein Aufruf einer Funktion, die ihren Rückgabewert auswertet. Sie möchten den Ereignis-Listener auf Ihre Funktion setzen, nicht auf undefined (was das Ergebnis des Aufrufs Ihrer Funktion ist).

Der Schlüssel zum Verständnis ist die Tatsache, dass Funktionen in JavaScript auch Werte sind, genauso wie Zahlen oder Strings oder Objekte. (In der Tat, sie sind eine spezielle Art von Objekt.)

var adderFuncValue = function(x, y) { return x + y; }; 
function multiplierFuncValue(x, y) { return x * y; }; 

function callFuncWithTwoParams(func, p1, p2) { 
    func(p1, p2); 
} 

callFuncWithTwoParams(adderFuncValue, 3, 5); // 8 
callFuncWithTwoParams(multiplierFuncValue, 2, 3); // 6 
var someFunc = adderFuncValue; 
someFunc(7, 8); // 15 

So wie ich funktionelle Werte in callFuncWithTwoParams bin vorbei, Sie übergeben einen funktionalen Wert in addEventListener. Der Browser merkt sich diese Funktion und verknüpft sie mit dem Ereignis change und ruft sie später auf.

+0

Vielen Dank. Elegant erklärt - Ich bin überrascht, dass ich das nach zwei Monaten nicht wusste. Sorry für das Posten einer doppelten Frage - Ich habe zuerst Google ausprobiert, aber irgendwie vermisst. Downvotes haben meine Seele zerschmettert, keine weiteren Posts von mir für eine Weile:/ –

+0

Mach dir keine Sorgen über einen einzigen Downvote; Auch wenn Sie eine Weile nicht hier waren, wird nicht erwartet, dass Sie wissen, dass jemand die Antwort auf die gleiche Frage geschrieben hat; Ich kannte mich selbst nicht, also antwortete ich. – Amadan

Verwandte Themen