the statement script que node missing form es6 enable javascript global ecmascript-5 ecma262 strict-mode

javascript - statement - Obtener una referencia al objeto global en un entorno desconocido en modo estricto



use strict que es (3)

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

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. Dado que el objeto global es el VO para el ámbito global, las propiedades del objeto global son variables globales, por lo que podemos usarlas para obtener un control del objeto global desde cualquier lugar:

  • En un navegador web, podemos usar window o self .

  • 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 usar 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, ya que no definido this no hace referencia al objeto global en modo estricto :

Si esto se evalúa dentro del código de modo estricto, este valor no se coacciona con 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 de envoltura. 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 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 manejar el objeto global en cualquier entorno, independientemente del modo estricto ?

Por cierto, mi enfoque actual es olfatear las variables globales que hacen referencia al objeto global como este:

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 abordan el problema de WSH.


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

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


En ES5, puede obtener una referencia al objeto global desde el modo estricto a través de la llamada de evaluación indirecta:

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

Eche un vistazo a mi artículo ; particularmente en esta sección en modo estricto .


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 significa que el objeto global está en el contexto global , por lo que la solución es simple:

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

Esto significa que debes contaminar el espacio de nombres global con una referencia a sí mismo, pero como dices, ya debería haber estado allí.