¿Cuál es la forma recomendada de obtener un identificador para el global object en el modo estricto ES5 en un entorno de host desconocido?Obtener una referencia al objeto global en un entorno desconocido en el modo estricto
ECMAScript no proporciona una forma incorporada para hacer referencia al objeto global del que soy consciente. Si lo hace, esta es la respuesta que estoy buscando.
En un entorno conocido, el objeto global suele tener una propiedad autorreferencial. Puesto que el objeto global es el VO para el ámbito mundial, las propiedades del objeto global son variables globales, por lo que puede utilizarlos obtener un identificador para el objeto global desde cualquier lugar:
En un navegador web, podemos use
window
oself
.En node.js, podemos usar
global
.
Sin embargo, este no es necesariamente el caso en todos los entornos de host. Por lo que sé, Windows Script Host no proporciona ninguna forma de acceder al objeto global. La forma recomendada de obtener el objeto global en WSH parece ser utilizar la palabra clave this
en un contexto donde no se resuelve en un objeto. Por ejemplo:
var GLOBAL = (function(){return this}());
Esta técnica funcionará para cualquier entorno de acogida, pero no en el modo estricto, ya que un indefinido this
no hacer referencia al objeto global en strict mode:
Si esto se evalúa dentro de un estricto modo de código, entonces este valor no se coacciona a un objeto. A este valor de nulo o indefinido no se convierte en el objeto global y los valores primitivos no se convierten en objetos contenedoras. Este valor pasado a través de una llamada a función (incluidas las llamadas realizadas con Function.prototype.apply y Function.prototype.call) no obliga a pasar este valor a un objeto (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4).
Como se esperaba, el código siguiente produce en undefined
:
(function(){
"use strict";
var GLOBAL = (function(){return this}());
console.log(GLOBAL);
}());
Así que, ¿cuál es la forma correcta de obtener un identificador para el objeto global en cualquier ambiente, sin importar el modo estricto?
Por cierto, mi enfoque actual es para olfatear para las variables globales que hacen referencia al objeto global como esto:
var self, window, global = global || window || self;
... y luego sólo tiene que utilizar global
. Creo que esta es una mala solución por varias razones, la mayoría de las cuales son bastante obvias y no abordan el problema de WSH.
no pudo hacer ''use strict'; (función (global) {}) (esto) '? (No probé esto en absoluto). – Marshall
Eso funciona en Node.js, al menos, @Marshall –
@DavidEllis Woops, esa es mi plataforma de elección O_o Creo que debería consultarlo en otros antes de decir algo;) – Marshall