Qual è il modo consigliato per ottenere un handle per in modalità rigorosa ES5 in un ambiente host sconosciuto?Ottenere un riferimento all'oggetto globale in un ambiente sconosciuto in modalità rigorosa
ECMAScript non fornisce un modo integrato per fare riferimento all'oggetto globale di cui sono a conoscenza. Se lo fa, questa è la risposta che sto cercando.
In un ambiente noto, l'oggetto globale di solito ha una proprietà autoreferenziale. Poiché l'oggetto globale è il VO per l'ambito globale, proprietà dell'oggetto globale sono variabili globali, in modo che possiamo utilizzare ottenere un handle all'oggetto globale da qualsiasi luogo:
In un browser web, possiamo utilizzare
window
oself
.In node.js, è possibile utilizzare
global
.
Tuttavia, questo non è necessariamente il caso in tutti gli ambienti host. Per quanto ne so, Windows Script Host non fornisce alcun modo per accedere all'oggetto globale. Il modo consigliato per ottenere l'oggetto globale in WSH sembra essere quello di utilizzare la parola chiave this
in un contesto in cui non si risolve in un oggetto. Ad esempio:
var GLOBAL = (function(){return this}());
Questa tecnica funziona per qualsiasi ambiente host, ma non in modo rigoroso, perché un indefinito this
non riferimento all'oggetto globale strict mode:
Se questo viene valutata entro rigorosa codice di modalità, quindi questo valore non è forzato a un oggetto. Un valore null o undefined non viene convertito nell'oggetto globale e i valori primitivi non vengono convertiti in oggetti wrapper. Il valore passato tramite una chiamata di funzione (comprese le chiamate effettuate usando Function.prototype.apply e Function.prototype.call) non costringe il valore passato a questo oggetto (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4).
Come previsto, il codice seguente genera undefined
:
(function(){
"use strict";
var GLOBAL = (function(){return this}());
console.log(GLOBAL);
}());
Quindi, qual è il modo corretto di ottenere un handle all'oggetto globale in qualsiasi ambiente, indipendentemente dalla modalità rigorosa?
A proposito, il mio approccio attuale è a fiutare per le variabili globali riferimento all'oggetto globale come questo:
var self, window, global = global || window || self;
... e poi basta usare global
. Penso che questa sia una cattiva soluzione per una serie di motivi, molti dei quali sono abbastanza ovvi, e non affronta il problema WSH.
non potresti fare "uso rigoroso"; (function (global) {}) (this) '? (Non ho provato questo qualunque). – Marshall
Che funziona in Node.js, almeno, @Marshall –
@DavidEllis woops, questa è la mia piattaforma di scelta O_o Credo che dovrei controllarlo in altri prima di dire nulla;) – Marshall