Ich habe versucht, in der ES6 suche mich Entwurf, aber ich bin mir nicht sicher, wo sie suchen:`this` in globalem Bereich in ECMAScript 6
Kann mir jemand sagen, ob this
unbedingt in ES6 auf den globalen verweist Objekt? Verfügt dieses Objekt über dieselben Member wie den globalen Bereich?
Wenn Sie für ES5 antworten könnten, wäre das auch hilfreich.
Ich weiß, this
im globalen Bereich bezieht sich auf das globale Objekt im Browser und in den meisten anderen ES-Umgebungen, wie Node. Ich möchte nur wissen, ob dies das definierte Verhalten der Spezifikation ist oder ob es sich um ein erweitertes Verhalten handelt, das die Implementierer hinzugefügt haben (und wenn dieses Verhalten in ES6-Implementierungen fortgesetzt wird). Ist das globale Objekt immer das gleiche wie der globale Bereich? Oder gibt es Unterschiede?
Update - Warum will ich wissen: Ich bin im Grunde genommen, um herauszufinden, wie das globale Objekt zuverlässig in ES5 & 6. Ich auf window
verlassen kann nicht bekommen, weil das für den Browser ist, noch kann ich mich auf global
verlassen, weil das spezifisch für Umgebungen wie Node ist. Ich weiß, this
in Node kann auf module
im Modul Bereich beziehen, aber ich denke, es bezieht sich immer noch auf global
im globalen Umfang. Ich möchte eine Cross-Umwelt-ES5 & 6-konforme Möglichkeit, das globale Objekt (wenn möglich) zu erhalten. Es scheint, als ob in all den Umgebungen, die ich kenne von this
im globalen Bereich, dass, aber ich möchte wissen, ob es Teil der eigentlichen Spezifikation ist (und so zuverlässig über jede Umgebung, die ich nicht vertraut sein kann).
Ich muss auch wissen, ob der globale Bereich und das globale Objekt die gleiche Sache von der Spezifikation sind. Mit anderen Worten sind alle Variablen im globalen Gültigkeitsbereich gleich globalobject.variable_name
?
Update 2 - Was ich bin versucht:
Ich habe einige ES6 shims for ES5 environments entwickelt. Ich möchte den besten Weg kennen, um (1) zu prüfen, ob die ES6-Einbauten bereits existieren, so dass sie wenn möglich anstelle meiner Beilagen verwendet werden können, und (2) meine Unterlegscheiben dem globalen Umfang hinzuzufügen, wenn die eingebauten Ins existieren nicht schon.
Zur Zeit ist ich nach diesem Muster:
(function() {
// Indirect eval to run in global scope.
// (We get whatever "this" is in global scope, hoping that it's the global object...
// Whether this line does what I want it to is the crux of my question.)
var global = (0, eval)('this');
// If Symbol does not already exist in global scope,
if (!global.Symbol)
// Then add Symbol to global scope.
global.Symbol = (function() {
// ...
// Return my Symbol shim
})();
})();
Es gibt einige andere Möglichkeiten (1), aber am Ende des Tages ich einen Weg brauchen, um etwas zu globalen Bereich hinzuzufügen, ohne var
in globale Reichweite (denn das würde die Einbauten außer Kraft setzen, bevor ich sie überprüfen können, aufgrund var
Hebe [zumindest in der naiven Fall, vielleicht könnte ich indirekte eval
eine var
Aussage auch?]). Ich möchte, dass mein Code im strikten Modus ausgeführt werden kann, so dass das Problem zusammenhängt.
Ich habe entdeckt, dass durch die ES5 spec, indirekte eval
Code in globalem Bereich ausführt. Das kann ich zumindest. Meine Fragen sind, wenn ich this
in globalen Bereich zu erhalten, (1) Will die Überprüfung der Eigenschaften dieses Objekts lassen Sie mich wissen, ob ein Einbau-existiert bereits im globalen Bereich? und (2) Erlaubt das Hinzufügen von Eigenschaften zu diesem Objekt das Hinzufügen von Variablen zum globalen Bereich?
Es sollte wie vorherige ES-Spezifikationen funktionieren, da "dies" nicht ES6-spezifisch ist. Die Bedeutung von "this" hängt davon ab, wo es verwendet wird, und ist nicht immer das globale Objekt. – Jay
Verstanden; Deshalb habe ich "in globalem Umfang" gefragt, wo in Browsern "this" dasselbe ist wie "window", welches auch das globale Objekt ist. Ich weiß jedoch nicht, ob dies in ES angegeben ist oder ob es sich lediglich um eine Browser-Erweiterung der Sprache handelt. –
Solange Sie nicht in etwas wie SES sind, wird der indirekte Evaluierungstrick zuverlässig funktionieren. Sobald Sie das globale Objekt haben, können Sie es zuweisen und Eigenschaften überprüfen und dies wird tun, was Sie wollen. In es6, jenseits dessen, was Andreas über let, const usw. gesagt hat, gibt es auch die Frage, ob Module ihr eigenes privates globales haben, das das globale Hauptobjekt als äußeren Geltungsbereich hat. Daher ist es unmöglich, auf das äußere globale Objekt zuzugreifen oder es zu modifizieren Es wird zur Verfügung gestellt (wie node.js zum Beispiel "global" automatisch definieren, würde Ihnen einen Verweis auf diese äußere globale geben). –