365 Stimmen

JavaScript: Übergabe von Parametern an eine Callback-Funktion

Ich versuche, einen Parameter an eine Funktion zu übergeben, die als callback Wie kann ich das tun?

Dies ist mein Versuch:

function tryMe(param1, param2) {
  alert(param1 + " and " + param2);
}

function callbackTester(callback, param1, param2) {
  callback(param1, param2);
}

callbackTester(tryMe, "hello", "goodbye");

320voto

Simon Scarfe Punkte 8980

Wenn Sie etwas Allgemeineres wollen, können Sie die Variable arguments wie folgt verwenden:

function tryMe(param1, param2) {
  alert(param1 + " and " + param2);
}

function callbackTester(callback) {
  callback(arguments[1], arguments[2]);
}

callbackTester(tryMe, "hello", "goodbye");

Aber ansonsten funktioniert Ihr Beispiel gut ( arguments[0] kann verwendet werden anstelle von callback im Prüfgerät)

248voto

Marimuthu Madasamy Punkte 12686

Das würde auch funktionieren:

// callback function
function tryMe(param1, param2) {
  alert(param1 + " and " + param2);
}

// callback executer 
function callbackTester(callback) {
  callback();
}

// test function
callbackTester(function() {
  tryMe("hello", "goodbye");
});

Ein anderes Szenario:

// callback function
function tryMe(param1, param2, param3) {
  alert(param1 + " and " + param2 + " " + param3);
}

// callback executer 
function callbackTester(callback) {
  //this is the more obivous scenario as we use callback function
  //only when we have some missing value
  //get this data from ajax or compute
  var extraParam = "this data was missing";

  //call the callback when we have the data
  callback(extraParam);
}

// test function
callbackTester(function(k) {
  tryMe("hello", "goodbye", k);
});

80voto

Andy E Punkte 324972

Ihre Frage ist unklar. Wenn Sie fragen, wie Sie dies auf einfachere Weise tun können, sollten Sie einen Blick auf die ECMAScript 5th Edition Methode werfen .bind() die Mitglied ist von Funktion.prototyp . Damit können Sie etwa so vorgehen:

function tryMe (param1, param2) {
    alert (param1 + " and " + param2);
}

function callbackTester (callback) {
    callback();
}

callbackTester(tryMe.bind(null, "hello", "goodbye"));

Sie können auch den folgenden Code verwenden, der die Methode hinzufügt, wenn sie im aktuellen Browser nicht verfügbar ist:

// From Prototype.js
if (!Function.prototype.bind) { // check if native implementation available
  Function.prototype.bind = function(){ 
    var fn = this, args = Array.prototype.slice.call(arguments),
        object = args.shift(); 
    return function(){ 
      return fn.apply(object, 
        args.concat(Array.prototype.slice.call(arguments))); 
    }; 
  };
}

Beispiel

bind() - PrototypeJS-Dokumentation

20voto

Zeeman Chen Punkte 171

Wenn Sie nicht sicher sind, wie viele Parameter Sie an Callback-Funktionen übergeben wollen, verwenden Sie apply Funktion.

function tryMe (param1, param2) {
  alert (param1 + " and " + param2);
}

function callbackTester(callback,params){
    callback.apply(this,params);
}

callbackTester(tryMe,['hello','goodbye']);

14voto

Blake Mills Punkte 804

Wenn Sie einen Callback haben, der von etwas anderem als Ihrem Code mit einer bestimmten Anzahl von Parametern aufgerufen wird und Sie zusätzliche Parameter übergeben möchten, können Sie eine Wrapper-Funktion als Callback übergeben und innerhalb des Wrappers die zusätzlichen Parameter übergeben.

function login(accessedViaPopup) {
    //pass FB.login a call back function wrapper that will accept the
    //response param and then call my "real" callback with the additional param
    FB.login(function(response){
        fb_login_callback(response,accessedViaPopup);
    });
}

//handles respone from fb login call
function fb_login_callback(response, accessedViaPopup) {
    //do stuff
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X