Signatur
Beschreibung
Die Methode toString() von Function-Instanzen gibt den Quelltext einer Funktion als String zurück. Seit ES2019 ist festgelegt, dass bei selbst geschriebenen Funktionen der exakte Quelltextausschnitt zurückkommt, also mit Leerzeichen, Zeilenumbrüchen und Kommentaren – vom ersten Zeichen der Definition (z. B. function, async, class oder dem ersten Parameter einer Arrow-Funktion) bis zur schließenden Klammer.
Bei eingebauten Funktionen (z. B. Math.max), gebundenen Funktionen (bind()) und Proxys, die sich wie Funktionen verhalten, gibt es keinen JavaScript-Quelltext. Dann liefert die Methode einen Platzhalter im Format function name() { [native code] }.
JavaScript ruft toString() automatisch auf, wenn eine Funktion in einen String umgewandelt wird, etwa bei der Verkettung mit + oder in Template-Literalen. Nützlich ist die Methode beim Debuggen, in Werkzeugen zur Code-Analyse, beim Übertragen einfacher Funktionen an Web Worker (per Blob-URL) und um grob zu prüfen, ob eine Funktion nativ ist.
Wird die Methode auf einem Wert aufgerufen, der keine Funktion ist, wirft sie einen TypeError.
Rückgabewert
function name() { [native code] }.Beispiele
Quelltext verschiedener Funktionsarten ausgeben
function summe(a, b) {
// Addiert zwei Zahlen
return a + b;
}
const quadrat = (x) => x * x;
class Punkt { constructor(x) { this.x = x; } }
console.log(summe.toString());
console.log(quadrat.toString());
console.log(Punkt.toString());
console.log(`${async function lade() {}}`);
Eingebaute und gebundene Funktionen
console.log(Math.max.toString());
const gebunden = function gruss() { return 'Hallo'; }.bind(null);
console.log(gebunden.toString());
// Grobe Prüfung, ob eine Funktion nativ ist
const istNativ = (fn) => /\{\s*\[native code\]\s*\}\s*$/.test(Function.prototype.toString.call(fn));
console.log(istNativ(fetch), istNativ(() => {}));
Funktion als Web Worker ausführen
const arbeit = () => {
self.onmessage = (e) => self.postMessage(e.data * 2);
};
// Funktionsquelltext als sofort ausgeführten Ausdruck in einen Blob schreiben
const blob = new Blob([`(${arbeit.toString()})()`], { type: 'text/javascript' });
const worker = new Worker(URL.createObjectURL(blob));
worker.onmessage = (e) => console.log('Ergebnis:', e.data);
worker.postMessage(21);
TypeError bei Nicht-Funktionen
try {
Function.prototype.toString.call({});
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Keine Closures: Der zurückgegebene String enthält nur den Quelltext, nicht den umgebenden Gültigkeitsbereich. Rekonstruiert man eine Funktion per
evalodernew Function, fehlen die Variablen der Closure – undthissowie Imports sind anders gebunden. - Minifizierung und Transpiler: In ausgelieferten Builds liefert
toString()den minifizierten oder transpilierten Code. Logik, die sich auf Parameternamen oder Formatierung verlässt (z. B. Dependency Injection über Parameternamen), geht dabei kaputt. - Nativ-Erkennung ist nicht sicher:
fn.toStringlässt sich überschreiben. Deshalb besserFunction.prototype.toString.call(fn)verwenden – aber auch das lässt sich durch Monkey-Patching oder Proxys umgehen. - Sicherheit: Quelltext aus
toString()niemals ungeprüft anevalübergeben oder in HTML einfügen. Blob-Worker brauchen unter einer strengen CSP die Freigabeworker-src blob:. - Kompatibilität: Die Methode gibt es in allen Umgebungen. Die exakte Wiedergabe von Kommentaren und Leerzeichen (ES2019) unterstützen alle modernen Browser und Node.js 10+. Ältere Engines haben den Quelltext teilweise neu formatiert.