javascript - statement - ¿Por qué es "esto" en una función anónima indefinida cuando se usa estricto?
use strict que es (3)
De acuerdo con la respuesta de This Stack Overflow , puede usar this
dentro de funciones anónimas, simplemente llamando .call(this)
al final del mismo.
(function () {
"use strict";
this.foo = "bar";
}).call(this);
¿Por qué está esto en una función anónima indefinida cuando se usa 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).
Es porque, hasta ECMAscript 262 edición 5, había una gran confusión si las personas que usaban el constructor pattern
olvidaban usar la new
palabra clave. Si olvidó usar new
cuando llama a una función de constructor en ES3, this
referencia al objeto global ( window
en un navegador) y le daría una paliza al objeto global con variables.
Eso fue un comportamiento terrible y, por lo tanto, la gente de ECMA decidió, solo para establecerlo como 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)
Hay un mecanismo llamado "boxeo" que envuelve o cambia this
objeto antes de ingresar al contexto de la función llamada. En su caso, el valor de this
debería estar undefined
porque no está llamando a la función como un método de un objeto. Si no es el modo estricto, en este caso, este es reemplazado por el objeto window
. En modo strict
, siempre se mantiene sin cambios, por eso no está undefined
aquí.
Puede encontrar más información en
https://developer.mozilla.org/en/JavaScript/Strict_mode