Start · Sprachen · JavaScript · Referenz · Function.prototype.toString()

Function.prototype.toString()

Methode

Gibt einen String mit dem Quellcode der Funktion zurück – bei eingebauten oder gebundenen Funktionen einen Platzhalter mit <code>[native code]</code>.

seit JavaScript ES1; exakter Quelltext seit ES2019 standardisiert Kategorie: method-property

Signatur

Function.prototype.toString()

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

Typ
string
Beschreibung
Der Quelltext der Funktion. Bei eingebauten, gebundenen oder anderen Funktionen ohne JavaScript-Quelltext ein Platzhalter der Form 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() {}}`);
function summe(a, b) { // Addiert zwei Zahlen return a + b; } (x) => x * x class Punkt { constructor(x) { this.x = x; } } 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(() => {}));
function max() { [native code] } function () { [native code] } true false

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);
Ergebnis: 42

TypeError bei Nicht-Funktionen

try {
  Function.prototype.toString.call({});
} catch (err) {
  console.log(err.name);
}
TypeError

// Wichtig · Fallstricke

  • Keine Closures: Der zurückgegebene String enthält nur den Quelltext, nicht den umgebenden Gültigkeitsbereich. Rekonstruiert man eine Funktion per eval oder new Function, fehlen die Variablen der Closure – und this sowie 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.toString lässt sich überschreiben. Deshalb besser Function.prototype.toString.call(fn) verwenden – aber auch das lässt sich durch Monkey-Patching oder Proxys umgehen.
  • Sicherheit: Quelltext aus toString() niemals ungeprüft an eval übergeben oder in HTML einfügen. Blob-Worker brauchen unter einer strengen CSP die Freigabe worker-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.