¿Por qué no está definido esto en una función anónima cuando se usa javascript en modo estricto? Entiendo por qué esto podría tener sentido, pero no pude encontrar una respuesta concreta.
Ejemplo:
(function () {
    "use strict";
    this.foo = "bar"; // *this* is undefined, why?
}());
Prueba en un violín: http://jsfiddle.net/Pyr5g/1/ Revisa el registrador (firebug).
                    
                        javascript
                                anonymous-function
                                use-strict
                                
                    
                    
                        T. Junghans
fuente
                
                fuente

Respuestas:
Es porque, hasta ECMAscript 262 edición 5, había una gran confusión si las personas que usaban el
constructor pattern, olvidaban usar lanewpalabra clave. Si olvidó usarnewal llamar a una función de constructor en ES3,thishaga referencia al objeto global (windowen un navegador) y golpearía el objeto global con variables.Ese fue un comportamiento terrible y la gente de ECMA decidió
thishacerloundefined.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 objectLa última línea arrojaría un error en ES5 estricto
"TypeError: this is undefined"(que es un comportamiento mucho mejor)
fuente
this === windowes confusa y filtra el alcance global como un token en funcionesExiste un mecanismo llamado "boxing" que envuelve o cambia el
thisobjeto antes de ingresar al contexto de la función llamada. En su caso, el valor dethisdebería serundefinedporque no está llamando a la función como un método de un objeto. Si el modo no es estricto, en este caso, se reemplaza por elwindowobjeto. En elstrictmodo siempre no cambia, por eso estáundefinedaquí.Puede encontrar más información en
https://developer.mozilla.org/en/JavaScript/Strict_mode
fuente
De acuerdo con la respuesta de This Stack Overflow , puede usar
thisfunciones anónimas internas, simplemente llamando.call(this)al final.(function () { "use strict"; this.foo = "bar"; }).call(this);fuente
thisserá elWindowobjeto en este caso, que puede no ser deseado