Pregunta

¿Cuál es la forma recomendada de controlar el objeto global en modo estricto ES5 en un entorno de host desconocido?

ECMAScript no proporciona una forma integrada de hacer referencia al objeto global que yo sepa.Si es así, esta es la respuesta que estoy buscando.

en un entorno conocido, el objeto global suele tener una propiedad autorreferencial.Dado que el objeto global es el VO Para el alcance global, las propiedades del objeto global son variables globales, por lo que podemos usarlas para controlar el objeto global desde cualquier lugar:

  • En un navegador web podemos utilizar window o self.

  • En node.js, podemos usar global.

Sin embargo, este no es necesariamente el caso en todos los entornos de host.Hasta donde yo 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 el this palabra clave 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 host, pero no en modo estricto, porque un valor indefinido this no hace referencia al objeto global en Modo estricto:

Si esto se evalúa dentro del código de modo estricto, entonces este valor no se fuerza a un objeto. Este valor de nulo o indefinido no se convierte al objeto global y los valores primitivos no se convierten en objetos contenedor.Este valor pasado a través de una llamada de función (incluidas las llamadas realizadas usando 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 era de esperar, el siguiente código da como resultado undefined:

(function(){
    "use strict";
    var GLOBAL = (function(){return this}());
    console.log(GLOBAL);
}());

Entonces, ¿cuál es la forma correcta de obtener un identificador del objeto global en cualquier entorno, independientemente del modo estricto?

Por cierto, mi enfoque actual es buscar variables globales que hagan referencia al objeto global de esta manera:

var self, window, global = global || window || self;

...y luego solo usa global.Creo que esta es una mala solución por varias razones, la mayoría de las cuales son bastante obvias, y no aborda el problema de WSH.

¿Fue útil?

Solución

En ES5, puede obtener una referencia a un objeto global desde el modo estricto mediante una llamada de evaluación indirecta:

"use strict";
var global = (1,eval)('this');

Echa un vistazo a mi articulo;particularmente en este sección sobre modo estricto.

Otros consejos

En código global, el thisBinding se establece en el objeto global independientemente del modo estricto.Eso significa que puedes pasarlo desde allí a tu módulo IEFE:

// "use strict"; or not
(function(global) {
    "use strict";
    …
    console.log(global);
    …
}(this));

En modo estricto, la forma de obtener una referencia al objeto global es asignar una variable en el objeto global que hace referencia a sí mismo.

Eso es this significa el objeto global cuando está en el contexto global, entonces la solución es simplemente:

"use strict";
var global = global || this;
(function() { global.hello = "world"; })();
console.log(hello); // Outputs 'world' as expected

Este hace Significa que tienes que contaminar el espacio de nombres global con una referencia a sí mismo, pero como dices, ya debería haber estado allí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top