Es ist nicht wirklich ein Singleton, weil Sie mit der Funktion Window.open
eine neue Instanz erstellen können. Der Rückgabewert ist ein Verweis auf dieselben Objektskripts innerhalb der Skripts innerhalb dieses neuen Fensters, die als ihr globales Objekt window
angezeigt werden.
Ich würde klarstellen, dass Singletons eine Art des globalen Staates sind, aber es ist nicht die einzige Art. Und wahr, alles, was auf dem aktuellen window
Objekt definiert ist, ist überall in Ihrem Skript sichtbar. So stellt der window
direkt Ihren globalen Zustand dar, obwohl es technisch kein Singleton
ist.
Nun, wie können Sie in Bezug auf Ihre zweite Frage damit umgehen, dass JavaScript beim Testen globale Gültigkeit hat? Nun, das ist viel schwieriger. Selbst in Umgebungen, die kein window
Objekt haben, wie Node.js, gibt es noch einige globale Objekte. Dinge wie die Aktivierung von strict mode können einen langen Weg gehen, um das versehentliche Erstellen von Variablen im globalen Gültigkeitsbereich zu vermeiden, und Sie können möglicherweise verhindern, dass eine Funktion dem globalen Status so hinzufügt (ich bin nicht sicher, ob dies ratsam ist, aber es funktioniert):
"use strict"
Object.preventExtensions(window);
function testfunc() {
window.someVar = 0; // Can't add property x, object is not extensible
console.log("testfunc", window.someVar);
}
Aber ich glaube nicht, Sie in der Lage sein würden vollständig die Möglichkeit der globale Status zu beeinflussen Ihren Code zu beseitigen. Ein gängiges Beispiel ist die window.name
Eigenschaft, die an unerwarteten Stellen auftauchen können, wie folgt aus:
"use strict"
Object.preventExtensions(window);
function testfunc() {
console.log("testfunc", name); // perfectly valid
}
Einige statische Analyse-Tools wie JSLint können diese Arten von Fehlern fangen helfen.
Nun, ich würde es als einen Ausnahmefall dann sehen, ich spreche im Allgemeinen, d. H. Während wir kümmern uns um unsere Javascript-Code. – CodeYogi
@CodeYogi Ja, es sieht * in vielerlei Hinsicht wie ein Singleton aus, aber in Wahrheit ist es das nicht. Man könnte es einen "Pseudo-Singleton" nennen. –
Welche Vorschläge hast du bezüglich des Tests mit globalen Zuständen wie 'window'? können wir es verspotten? – CodeYogi