Eine Funktion mit Argumenten als Argument übergeben?

Lesezeit: 4 Minuten

Lucias Benutzeravatar
Lucia

Ist es möglich, eine Javascript-Funktion mit Argumenten als Argument zu übergeben?

Beispiel:

$(edit_link).click( changeViewMode( myvar ) );

  • Es sieht aus wie JQuery und ist es höchstwahrscheinlich auch, aber das ist irrelevant. Die Verwendung von Parametern und Funktionen ist unabhängig davon, welche Javascript-Bibliotheken Sie verwenden, gleich.

    – Guffa

    19. August 2009 um 14:18

  • Wenn Sie mit React arbeiten, denken Sie über stackoverflow.com/questions/41369497/… nach.

    – Michael Freidgeim

    3. Februar 2020 um 1:22

Verwenden Sie einen „Abschluss“:

$(edit_link).click(function(){ return changeViewMode(myvar); });

Dadurch wird ein anonymer temporärer Funktionswrapper erstellt, der den Parameter kennt und ihn an die eigentliche Callback-Implementierung übergibt.

  • Wenn Sie eine Funktion für ein Objekt aufrufen möchten, müssen Sie bind() aufrufen. myObj.click( function() { this.doSomething(); }.bind( myObj ) ); Dadurch wird „this“ zu myObj.

    – Eli

    3. Okt. 2013 um 22:19

  • Ist das nicht ein Leistungsproblem, wenn man mit vielen davon umgeht? Beispiel: Sie rendern eine onPress in einer Zeile und haben 10.000 Zeilen. Dadurch wird für jede Zeile ein neuer anonymer temporärer Funktionswrapper erstellt. Gibt es eine andere Möglichkeit, es zu tun?

    – Joshua Pinter

    26. November 2017 um 18:23 Uhr

  • @JoshuaPinter Die Technik selbst ist kein Problem. Wenn Sie den gleichen Funktionsaufruf 10.000 Mal benötigen, können Sie den Wrapper einfach in einer Variablen speichern, sodass Sie ihn nur einmal erstellen müssen. Wenn Sie 10.000 verschiedene Kontexte übergeben müssen, können Sie wenig tun. Vorsicht vor vorzeitiger Optimierung: Wie immer bei der Leistung müssen Sie dies tun messen um zu sehen, ob es ein Problem gibt oder nicht. Heutige JavaScript-Engines sind sehr leistungsfähig und können Code auf überraschende Weise optimieren.

    – Ferdinand Beyer

    27. November 2017 um 9:49 Uhr

  • @FerdinandBeyer Großartig, danke für den Tipp. Ein Freund sagte mir, es sei eine schlechte Praxis und dass man sie stattdessen anwenden sollte this.myFunction = this.myFunction.bind(this) in deinem constructor Methode. Aber, wie Sie sagten, wenn Sie für jede einzelne unterschiedliche Kontexte übergeben müssen, z. B. für alle verschiedenen Zeilen, auf die Sie klicken, um die Detailseite dieser Zeile zu öffnen, ist dies nicht vermeidbar.

    – Joshua Pinter

    27. November 2017 um 23:41 Uhr

  • In ES6 können Sie es vereinfachen, indem Sie Pfeilfunktionen verwenden. $(edit_link).click(() => changeViewMode(myvar));

    – Rodrigombs

    22. November 2020 um 14:10 Uhr


Verwenden Function.prototype.bind(). Zitat von MDN:

Der bind() Die Methode erstellt eine neue Funktion, die beim Aufruf ihre Funktion hat this Das Schlüsselwort wird auf den bereitgestellten Wert gesetzt, wobei eine bestimmte Folge von Argumenten vor allen angegebenen Argumenten steht, wenn die neue Funktion aufgerufen wird.

Es wird von allen gängigen Browsern unterstützt, einschließlich IE9+.

Ihr Code sollte so aussehen:

$(edit_link).click(changeViewMode.bind(null, myvar));

Randbemerkung: Ich gehe davon aus, dass Sie sich im globalen Kontext befinden, d this Variable ist window; sonst verwenden this anstatt null.

  • Danke, das hat mir geholfen. Habe es so verwendet: $.ajax(url).done(handler.bind(this, var1, var2));

    – Thomas

    16. Juni 2016 um 10:13


  • Welche Option ist die beste? Mit Schließung oder mit der Bind-Funktion? Bitte teilen Sie mir mit, ob es Auswirkungen auf die Leistung gibt

    – Varun

    7. September 2016 um 8:50 Uhr

  • @Varun Siehe Warum ist die Bindung langsamer als eine Schließung?

    – Michał Perłakowski

    7. September 2016 um 13:48

  • Ich habe verwendet fn.bind(this) um das Gefürchtete zu lösen this Verwirrung bei Rückruffunktionen, ohne den umfassenderen Zweck zu verstehen bind – aber jetzt verstehe ich es! Danke 🙏

    – flache Gurken

    7. Juni 2022 um 5:58


Nein, aber Sie können einen ohne Parameter übergeben und Folgendes tun:

$(edit_link).click(
  function() { changeViewMode(myvar); }
);

Sie übergeben also eine anonyme Funktion ohne Parameter. Diese Funktion ruft dann Ihre parametrisierte Funktion mit der Variablen im Abschluss auf

Oder wenn Sie es6 verwenden, sollten Sie in der Lage sein, eine Pfeilfunktion zu verwenden

$(edit_link).click(() => changeViewMode(myvar));

Ja genau so:

$(edit_link).click(function() { changeViewMode(myvar) });

Benutzeravatar von Alexandr Sargsyan
Alexandr Sargsyan

Du kannst das

var message="Hello World";

var callback = function(){
alert(this)
}.bind(message);

und dann

function activate(callback){
  callback && callback();
}

activate(callback);

Wenn Ihr Rückruf eine flexiblere Logik enthält, können Sie auch ein Objekt übergeben.

Demo

Benutzeravatar von erionpc
erionpc

Dies ist ein Beispiel, das dem Ansatz von Ferdinand Beyer folgt:

function function1()
{
    function2(function () { function3("parameter value"); });
}
function function2(functionToBindOnClick)
{
    $(".myButton").click(functionToBindOnClick);
}
function function3(message) { alert(message); }

In diesem Beispiel wird der „Parameterwert“ mithilfe eines Funktionsumbruchs von Funktion1 über Funktion2 an Funktion3 übergeben.

1454510cookie-checkEine Funktion mit Argumenten als Argument übergeben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy