Ich habe einige Ambiguität in Javascript Callback-Funktionen.Bei Übergabe Argument an eine Callback-Funktion
Der erste Code ist wie folgt strukturiert:
function firstFunction()
{
var message = "something";
secondFunction(message);
}
function secondFunction(message)
{
var myButton = document.getElementById("my-button");
myButton.addEventListener('click',thirdFunction(message));
}
function thirdFunction(message)
{
console.log("the messages is: "+message);
}
Als ich das Drehbuch oben ausgeführt, die thirdFunction
ohne Klicken auf die Schaltfläche ausgeführt wird.
Nach ein paar Recherchen habe ich über die closure
in Javascript gelesen. Dann habe ich den Code in die folgende Struktur geändert:
function firstFunction()
{
var message = "something";
secondFunction(message);
}
function secondFunction(message)
{
var myButton = document.getElementById("my-button");
myButton.addEventListener('click',thirdFunction);
}
function thirdFunction(message)
{
return function(){
console.log("the messages is: "+message);
}
}
Ich habe das erwartete Ergebnis. Die thirdFunction
wird nur ausgeführt, wenn auf die Schaltfläche geklickt wird.
Ich bin nicht sicher, ob ich meine zweite Code-Struktur richtig ist? Ich bin mir nicht sicher, ob ich das Schließungskonzept richtig verstehe, da ich vorher noch nie eine Funktion in der konventionellen Programmierung zurückgegeben habe. Das ist ein neues Konzept für mich. Bitte korrigiere mich wenn ich falsch liege.
EDIT: Einige der Lösungen schlagen vor, es wie folgt zu schreiben:
myButton.addEventListener('click', function() { thirdFunction(message) });
Für die Lesbarkeit des Codes, ich versuche, dies zu vermeiden. Ich bevorzuge es, den Code für die thirdFunction
außerhalb der secondFunction
zu platzieren.
nichts mit Rückrufen zu tun, es hat mit der Bindung Ereignis-Listener – epascarello
Ihren zweiten Code zu tun, würde funktionieren, wenn Sie 'myButton tun. addEventListener ('click', thirdFunction (message)); '- aber das Definieren solcher Closures inline ist besser lesbar. Ihr erster Code funktioniert, wenn Sie 'thirdFunction (message)' durch '() => thirdFunction (message)' ersetzen - was ich bevorzugen würde. –
Aber es hat funktioniert, als ich es gepostet habe ohne "Nachricht" zu übergeben. – user6875880