Start · Sprachen · JavaScript · Referenz · Window.self

Window.self

Eigenschaft

Die schreibgeschützte Eigenschaft <code>Window.self</code> gibt das Fenster selbst als <code>WindowProxy</code> zurück – identisch mit <code>window</code>.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

Window.self

Beschreibung

window.self verweist auf das globale Fensterobjekt selbst. Im Hauptkontext einer Seite gilt daher window.self === window, ebenso self === window. Rückgabewert ist ein WindowProxy, also dasselbe Objekt, das man auch über window, globalThis oder frames erhält.

Wirklich nützlich wird self, weil es auch in Web Workern existiert: Dort gibt es kein window, self verweist aber auf das globale WorkerGlobalScope (z. B. DedicatedWorkerGlobalScope oder ServiceWorkerGlobalScope). Code, der sowohl im Fenster als auch in Workern laufen soll, kann also über self auf den globalen Gültigkeitsbereich zugreifen.

Ein weiterer klassischer Einsatzzweck ist das Erkennen, ob eine Seite in einem <iframe> läuft: Der Vergleich window.self !== window.top ist genau dann wahr, wenn das aktuelle Dokument eingebettet ist.

In modernem Code, der plattformübergreifend (Browser, Worker, Node.js) laufen muss, ist globalThis (ES2020) die bessere Wahl, da self in Node.js nicht definiert ist.

Rückgabewert

Typ
WindowProxy
Beschreibung
Das Fensterobjekt selbst (identisch mit window). In Workern liefert self stattdessen den jeweiligen WorkerGlobalScope.

Beispiele

Identität von self und window prüfen

// Im Hauptkontext einer Seite
console.log(window.self === window);
console.log(self === window);
console.log(self === globalThis);
console.log(window.self.self.self === window);
true true true true

Erkennen, ob die Seite in einem iframe läuft

const isEmbedded = () => {
  try {
    return window.self !== window.top;
  } catch {
    // Zugriff auf window.top kann bei Cross-Origin-Sandboxing scheitern
    return true;
  }
};

if (isEmbedded()) {
  document.body.classList.add('embedded');
  console.log('Seite läuft eingebettet in einem Frame.');
} else {
  console.log('Seite läuft als Top-Level-Dokument.');
}
Seite läuft als Top-Level-Dokument.

self im Web Worker nutzen

// main.js
const workerCode = `
  self.addEventListener('message', (event) => {
    const summe = event.data.reduce((a, b) => a + b, 0);
    self.postMessage(summe);
  });
`;
const blob = new Blob([workerCode], { type: 'text/javascript' });
const worker = new Worker(URL.createObjectURL(blob));

worker.addEventListener('message', (event) => {
  console.log('Ergebnis vom Worker:', event.data);
});
worker.postMessage([1, 2, 3, 4]);
Ergebnis vom Worker: 10

Umgebungsunabhängigen globalen Kontext ermitteln

const getGlobal = () => {
  if (typeof globalThis !== 'undefined') return globalThis;
  if (typeof self !== 'undefined') return self;     // Fenster & Worker
  if (typeof window !== 'undefined') return window; // ältere Browser
  if (typeof global !== 'undefined') return global; // Node.js
  throw new Error('Globales Objekt nicht gefunden');
};

console.log(getGlobal() === self);
true

// Wichtig · Fallstricke

  • Nicht in Node.js: self ist in Node.js nicht definiert (außer in neueren Versionen teilweise über Web-Kompatibilitäts-Globals nicht garantiert). Für universellen Code globalThis verwenden.
  • Überschreibbar: self ist zwar als Leseeigenschaft spezifiziert, eine lokale Variable namens self (z. B. das verbreitete Muster const self = this;) verdeckt aber das globale self. Das führt leicht zu Verwechslungen – in modernem Code besser Pfeilfunktionen statt const self = this nutzen.
  • iframe-Erkennung: window.self !== window.top ist zuverlässig, ersetzt aber keinen Clickjacking-Schutz. Dafür serverseitig Content-Security-Policy: frame-ancestors bzw. X-Frame-Options setzen.
  • Kompatibilität: In allen Browsern seit jeher unterstützt; in Workern ebenfalls überall verfügbar.