¿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 lanew
palabra clave. Si olvidó usarnew
al llamar a una función de constructor en ES3,this
haga referencia al objeto global (window
en un navegador) y golpearía el objeto global con variables.Ese fue un comportamiento terrible y la gente de ECMA decidió
this
hacerloundefined
.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 ES5 estricto
"TypeError: this is undefined"
(que es un comportamiento mucho mejor)
fuente
this === window
es confusa y filtra el alcance global como un token en funcionesExiste un mecanismo llamado "boxing" que envuelve o cambia el
this
objeto antes de ingresar al contexto de la función llamada. En su caso, el valor dethis
debería serundefined
porque 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 elwindow
objeto. En elstrict
modo siempre no cambia, por eso estáundefined
aquí.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
this
funciones anónimas internas, simplemente llamando.call(this)
al final.(function () { "use strict"; this.foo = "bar"; }).call(this);
fuente
this
será elWindow
objeto en este caso, que puede no ser deseado