Pregunta ¿Por qué es "esto" en una función anónima indefinida cuando se usa estricto?


Por que es esta en una función anónima indefinida cuando usas javascript en modo estricto? Entiendo por qué esto podría tener sentido, pero no pude encontrar ninguna respuesta concreta.

Ejemplo:

(function () {
    "use strict";

    this.foo = "bar"; // *this* is undefined, why?
}());

Prueba en un violín: http://jsfiddle.net/Pyr5g/1/ Mira el registrador (firebug).


75
2018-03-22 12:45


origen


Respuestas:


Es porque, hasta ECMAscript 262 edición 5, había una gran confusión si las personas que usaban el constructor pattern, olvidé usar el new palabra clave. Si olvidó usar new al llamar a una función de constructor en ES3, this hace referencia al objeto global (window en un navegador) y usted golpearía el objeto global con variables.

Eso fue un comportamiento terrible y la gente en ECMA decidió, solo para establecer this a undefined.

Ejemplo:

function myConstructor() {
    this.a = 'foo';
    this.b = 'bar';
}

myInstance     = new myConstructor(); // all cool, all fine. a and b were created in a new local object
myBadInstance  = myConstructor(); // oh my gosh, we just created a, and b on the window object

La última línea arrojaría un error en estricto ES5

"TypeError: this is undefined"

(que es un comportamiento mucho mejor)


86
2018-03-22 12:50



Hay un mecanismo llamado "boxeo" que envuelve o cambia el this objeto antes de ingresar al contexto de la función llamada. En tu caso, el valor de this debiera ser undefined porque no estás llamando a la función como un método de un objeto. Si no es estricto modo, en este caso, este es reemplazado por el window objeto. En strict modo es siempre sin cambios, es por eso que es undefined aquí.

Puede encontrar más información en
https://developer.mozilla.org/en/JavaScript/Strict_mode


13
2018-03-22 13:00



De acuerdo a Esta respuesta de desbordamiento de pila, puedes usar this dentro de funciones anónimas, simplemente llamando .call(this) al final de eso.

(function () {
    "use strict";

    this.foo = "bar";
}).call(this);

6
2018-02-13 12:58