the statement que node missing method form es6 javascript anonymous-function use-strict

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