Was ist eine globale Symbolregistrierung?

9
%Vor%

ist window['sym'] , was bereits globaler Gültigkeitsbereich ist.

Aber MDN sagt:

  

Die obige Syntax mit der Funktion Symbol() erstellt kein globales Symbol, das in Ihrer gesamten Codebasis verfügbar ist. Verwenden Sie die Methoden Symbol.for() und Symbol.keyFor() zum Erstellen und Abrufen von Symbolen aus der globalen Symbolregistrierung, um zeichenübergreifend und in einer globalen bereichsähnlichen Umgebung zu erstellen.

sym ist bereits in einem Browser mit der obigen Deklarationssyntax im globalen Gültigkeitsbereich.

Was ist eine globale Symbolregistrierung?

Jedes HTML-Dokument ist mit window object verknüpft.

Also, In einer Browser-Welt, Wie funktioniert dieser Bereich der Symbolverfügbarkeit über Dateien / Realms anders vom globalen Bereich ( window object)?

    
overexchange 08.08.2015, 18:08
quelle

3 Antworten

8
%Vor%      

erstellt eine neue Eigenschaft sym im Dictionary ( window ), die im globalen Gültigkeitsbereich liegt und auf die als window['sym'] zugegriffen werden kann.

Nun, nein. Es erstellt ein Symbol und weist es einer lokalen Variable mit dem Namen sym zu. Nur wenn Sie diesen Code im globalen Bereich ausführen (was für Modularität normalerweise nicht der Fall ist), erstellt er eine Eigenschaft für das globale Objekt Ihres Realms (js-Umgebung). Beachten Sie, dass dieses globale Objekt nicht immer window wie in Webseiten ist, sondern von Ihrer Umgebung abhängt.

  

Was ist eine globale Symbolregistrierung?

Es ist eine Registry (Think: Dictionary) für Symbole, auf die Sie über einen String-Schlüssel zugreifen können. Und "global" bedeutet in diesem Fall sogar globaler als ein globaler Bereich. Die globale Symbolregistrierung deckt alle Bereiche Ihrer Engine ab. In einem Browser hätten die Webseite, ein Iframe und ein Web-Worker alle ihren eigenen Bereich mit eigenen globalen Objekten, aber sie könnten Symbole über diese globale Registrierung gemeinsam nutzen.

Und dieses Teilen ist genau der Zweck. Wenn Sie sonst

setzen würden %Vor%

an zwei Stellen, dann sym1 !== sym2 . Wenn Sie ein gemeinsames Objekt haben, würde die Verwendung des Symbols s als Eigenschaftsschlüssel zwei verschiedene Eigenschaften erzeugen. Wenn Sie das tun

%Vor%

then sym1 === sym2 und wenn Sie es verwenden, erhalten Sie immer die gleiche Eigenschaft.

Siehe auch Kreuze Realms mit Symbolen auf 2ality und Symbole und warum sie großartig sind für mehr Beispiele, einschließlich der bekannten Symbole, die ähnlich global sind.

    
Bergi 08.08.2015 18:53
quelle
5

Die globale Symbolregistrierung ist nur ein praktisches globales Repository für Symbolinstanzen. Sie können selbst eines implementieren, wenn Sie das möchten, aber wenn ein solches Repository eingebaut ist, bedeutet dies, dass die Laufzeitumgebung es als Ort für die Veröffentlichung von Symbolinstanzen verwenden kann, die für einen bestimmten Kontext eine besondere Bedeutung haben.

In Ihrer eigenen Anwendung können Sie entscheiden, dass bestimmte Arten von Objekten bestimmte Eigenschaften haben, die über ein Symbol zugänglich sind. Ihr gesamter Code kann diese Symbole über Symbol.for() finden:

%Vor%

Da die Registrierung global ist, funktioniert das unabhängig vom Umfang oder der Kompilierungseinheit.

Wenn die Registrierung Teil der Laufzeitumgebung ist, kann eine Umgebung wie Node.js den Symbolmechanismus verwenden, um Objekte zu erweitern, ohne befürchten zu müssen, dass Probleme mit Legacy-Code auftreten. Wenn Node zum Beispiel herausfinden wollte, wie viel Speicher ein Objekt verwendet, könnten sie ein Symbol erfinden, es in die Registrierung einfügen und den Registrierungsschlüssel dokumentieren. Jeder Code könnte dann folgendes verwenden:

%Vor%

(Das ist total erfunden; es macht für Node überhaupt keinen Sinn, das zu tun.) Aufgrund der Art und Weise, wie Symbole als Eigenschaftsschlüssel funktionieren, wird Code, der nichts davon weiß, keine seltsamen Probleme haben sollten die Objekte, die es manipuliert, plötzlich diese zusätzliche Eigenschaft mit sich herumtragen.

(Natürlich ist der Namespace der Symbolregistry selbst nur ein Namespace, also müssten Kollisionen dort genauso behandelt werden, wie wir mit Namenskollisionen im window -Objekt umgehen.)

    
Pointy 08.08.2015 18:20
quelle
0

Globale Symbolregistrierung ist für alle Iframes in einem Fenster vorhanden. (Da Symbole nicht über Arbeiter hinweg weitergegeben werden können, gibt es kein beobachtbares Konzept, dass sie über Arbeiter hinweg identisch sind, abgesehen von der Existenz von Seitenkanalinspektionen, z. B. durch Speicheruntersuchung .)

%Vor%

Symbol.for unterscheidet sich nicht wesentlich von der Implementierung eines eigenen Caches unter Verwendung einer Objektreferenz. Es ist nur eingebaut und somit bequemer. Anstelle von Symbol.for('a') können Sie einfach Folgendes tun:

%Vor%

.und pflegen Sie einen Verweis auf obj .

Da JavaScript keine API zum Entfernen von Symbolen in der globalen Registrierung bereitstellt, ist es in der Tat vorteilhaft, die manuelle Zwischenspeicherung durchzuführen, wenn Sie den Speicher der Registrierung manuell verwalten müssen.

    
Pacerier 17.09.2017 20:00
quelle

Tags und Links