Eigentlich wird Ihr Code ziemlich viel Arbeit, wie es ist, nur deklarieren Sie Ihre Callback als ein Argument und Sie können es direkt mit dem Argument Namen aufrufen.
Die Grundlagen
function doSomething(callback) {
// ...
// Call the callback
callback('stuff', 'goes', 'here');
}
function foo(a, b, c) {
// I'm the callback
alert(a + " " + b + " " + c);
}
doSomething(foo);
Das ruft doSomething
die Folgendes aufrufen wird foo
, die darauf hinweist, dass "die Sachen hierher gehören".
Beachten Sie, dass es sehr wichtig ist, die Funktion référence ( foo
), anstatt die Funktion aufzurufen und ihr Ergebnis zu übergeben ( foo()
). In Ihrer Frage machen Sie es richtig, aber es lohnt sich, darauf hinzuweisen, weil es ein häufiger Fehler ist.
Fortgeschrittenere Dinge
Manchmal möchten Sie den Callback aufrufen, damit er einen bestimmten Wert für this
. Das können Sie ganz einfach mit dem JavaScript call
Funktion:
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback) {
// Call our callback, but using our own instance as the context
callback.call(this);
}
function foo() {
alert(this.name);
}
var t = new Thing('Joe');
t.doSomething(foo); // Alerts "Joe" via `foo`
Sie können auch Argumente übergeben:
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback, salutation) {
// Call our callback, but using our own instance as the context
callback.call(this, salutation);
}
function foo(salutation) {
alert(salutation + " " + this.name);
}
var t = new Thing('Joe');
t.doSomething(foo, 'Hi'); // Alerts "Hi Joe" via `foo`
Manchmal ist es sinnvoll, die Argumente, die Sie dem Callback übergeben wollen, nicht einzeln, sondern als Array zu übergeben. Sie können verwenden apply
um das zu tun:
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback) {
// Call our callback, but using our own instance as the context
callback.apply(this, ['Hi', 3, 2, 1]);
}
function foo(salutation, three, two, one) {
alert(salutation + " " + this.name + " - " + three + " " + two + " " + one);
}
var t = new Thing('Joe');
t.doSomething(foo); // Alerts "Hi Joe - 3 2 1" via `foo`