ich geworden bin relativ neu in JS und ich habe auch gerade durch Eloquent Javascript zu lesen und ich fand es leichter zu verstehen, wenn ich den Aufruf der Funktion verstanden (Ihr Punkt 1) zu beantworten:
noisy(Boolean)(0);
die noisy(Boolean)
erstellt eine neue Funktion und die (0)
ist, nachdem sie, weil sie als Argument in diese neue Funktion übergeben wird. Wenn Sie auf die größer ist als Beispiel verweisen:
function greaterThan(n) {
return function(m) { return m > n; };
}
var greaterThan10 = greaterThan(10);
console.log(greaterThan10(11));
Es auf diese Weise auch genannt werden könnte:
greaterThan(10)(11);
Ich hoffe, dass klärt Ihre erste Frage, warum es auf diese Weise genannt.
Für die zweite Frage. Die f
in:
var val = f(arg);
ist die Funktion, die in Boolean
noisy
übergeben wurde, als noisy(Boolean)
eingegeben wurde. Es wurde dann als Argument in der geräuschvollen Funktion verwendet. Ich wusste auch nicht, dass Boolean eine Funktion für sich sein kann und nicht nur ein Datentyp. Wie andere gesagt haben - es konvertiert das Argument, das Sie ihm gegeben haben, in einen booleschen Wert und gibt das Ergebnis zurück.
Daher val
wird Boolean(arg)
, die Boolean(0)
wird, die false
auswertet. Wenn Sie versuchen, rufen Sie noisy(Boolean)(1);
Sie sehen es true
zurückgeben. Die console.log("called with", arg, "- got", val);
protokolliert einfach das Argument (0 in diesem Fall) und das Ergebnis der Auswertung (falsch).
Tatsächlich hat es die boolesche Funktion in eine geändert, die das Argument und das Ergebnis protokolliert und das Ergebnis zurückgibt.
Ich hoffe, das hilft. Nur das Schreiben hat mir geholfen, mein eigenes Verständnis zu verstehen.
@Crowder: Aber dann, wenn diese anfänglich begrenzten Dinge (Boolean, Number, String, und so weiter) sind Funktionen, warum var x = Zahl (5); Warnung (typeof x); // Nummer; Warnung (x instanceof Function); // false –
@ShirgillAnsari: Alles ist detailliert in [der Spezifikation] (http://www.ecma-international.org/ecma-262/6.0/index.html). 'var x = Nummer (5)'. Sie rufen die Funktion 'Number' als Funktion auf (nicht als Konstruktor). Die Spezifikation [sagt] (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-number-constructor-number-value), dass, wenn Sie das tun, es sein Argument in a umwandelt Nummer wenn nötig (besseres Beispiel: 'var x = Nummer (" 42 ")'). Für den zweiten Alarm, warum sollten Sie erwarten, dass 'x' eine Funktion ist? –
Oh, ich sehe, da es in einen primitiven booleschen Wert umgewandelt wurde, deshalb sagten Sie, warum erwarte ich, dass x eine Funktion ist? Ist es das, was du meintest? –