2017-06-23 3 views
-1

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.

+0

nichts mit Rückrufen zu tun, es hat mit der Bindung Ereignis-Listener – epascarello

+1

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. –

+0

Aber es hat funktioniert, als ich es gepostet habe ohne "Nachricht" zu übergeben. – user6875880

Antwort

0

eine anonyme Funktion wird den Verschluss in der richtigen Umgebung zu machen:

function secondFunction(message) 
{ 
    var myButton = document.getElementById("my-button"); 
    myButton.addEventListener('click', function() { 
    thirdFunction(message) 
    }); 
} 
Verwandte Themen