ho provato a guardare nella ES6 bozza me stesso, ma non sono sicuro dove guardare:`this` di portata globale nel ECMAScript 6
Qualcuno può dirmi se this
in ES6 si riferisce necessariamente al globale oggetto? Inoltre, questo oggetto avrà gli stessi membri dell'ambito globale?
Se potessi rispondere per ES5 sarebbe utile anche.
So che this
in ambito globale fa riferimento all'oggetto globale nel browser e nella maggior parte degli altri ambienti ES, come Nodo. Voglio solo sapere se questo è il comportamento definito dalle specifiche o se questo è un comportamento esteso che gli implementatori hanno aggiunto (e se questo comportamento continuerà nelle implementazioni ES6). Inoltre, l'oggetto globale è sempre la stessa cosa dell'ambito globale? O ci sono distinzioni?
Update - Perché voglio sapere: Sto fondamentalmente cercando di capire come ottenere l'oggetto globale affidabile in ES5 & 6. Non posso contare su window
perché è specifico per il browser, né posso contare su global
perché è specifico per ambienti come Node. So che lo this
nel nodo può riferirsi allo module
nell'ambito del modulo, ma penso che si riferisca ancora allo global
nell'ambito globale. Voglio un modo cross-environment ES5 & 6 per ottenere l'oggetto globale (se possibile). Sembra che in tutti gli ambienti che conosco di this
in ambito globale lo faccia, ma voglio sapere se fa parte delle specifiche attuali (e quindi affidabile in qualsiasi ambiente con cui non ho familiarità).
Ho anche bisogno di sapere se l'ambito globale e l'oggetto globale sono la stessa cosa dalle specifiche. In altre parole, tutte le variabili nell'ambito globale avranno lo stesso valore di globalobject.variable_name
?
Update 2 - Quello che sto cercando di fare:
ho sviluppato una certa ES6 shims for ES5 environments. Voglio sapere il modo migliore per (1) controllare se esistono già i built-in ES6 in modo che possano essere usati quando possibile invece dei miei shim, e (2) aggiungere i miei shim allo scope globale se il built-in ins non esistono già.
Attualmente sto seguendo questo schema:
(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
})();
})();
Ci sono alcune altre possibilità per (1), ma alla fine della giornata ho bisogno di un modo per aggiungere qualcosa alla portata globale senza utilizzare var
in ambito globale (perché questo sovrascriverebbe i built-in prima che io possa controllarli, a causa del sollevamento di var
[almeno nel caso naif, forse potrei indirizzare anche l'istruzione eval
a var
?]). Voglio che il mio codice sia in grado di funzionare in modalità rigorosa, in modo tale da aggravare il problema.
Ho scoperto che, tramite la specifica ES5, eval
indiretto esegue il codice in ambito globale. Quindi sono almeno in grado di farlo. Le mie domande sono se ottengo this
in ambito globale, (1) Verificando le proprietà di quell'oggetto fammi sapere se esiste già un built-in nell'ambito globale? e (2) L'aggiunta di proprietà a quell'oggetto mi consentirà di aggiungere variabili all'ambito globale?
Dovrebbe funzionare come le precedenti specifiche ES come "questo" non è specifico per ES6. Il significato di "questo" dipende da dove viene usato e non è sempre l'oggetto globale. – Jay
Capito; è per questo che ho chiesto "in ambito globale", dove nei browser "questo" è lo stesso di "finestra", che è anche l'oggetto globale. Non so, tuttavia, se questo è specificato in ES o se è solo un'estensione del browser per la lingua. –
Finché non sei in qualcosa come SES, il trucco di valutazione indiretto funzionerà in modo affidabile. Una volta che hai l'oggetto globale puoi assegnarlo e controllare le proprietà e questo farà ciò che vuoi. In es6, al di là di ciò che Andreas ha detto su let, const, ecc. C'è anche il problema dei moduli che hanno il loro globale privato che ha l'oggetto globale principale come un ambito esterno, quindi è impossibile accedere o modificare l'esterno globale a meno di un riferimento diretto viene fornito (come node.js che definisce automaticamente "globale", per esempio, ti darebbe un riferimento a quello globale esterno). –