Dlaczego "to" w funkcji anonimowej jest niezdefiniowane podczas używania strict?

Dlaczego to w funkcji anonimowej jest niezdefiniowane podczas korzystania z javascript w trybie ścisłym? Rozumiem, dlaczego to ma sens, ale nie mogłem znaleźć konkretnej odpowiedzi.

Przykład:

(function () {
    "use strict";

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

Test na skrzypcach: http://jsfiddle.net/Pyr5g/1 / Sprawdź rejestrator (firebug).

Author: TJ., 2012-03-22

3 answers

To dlatego, że do ECMAscript 262 edition 5, było duże zamieszanie, jeśli ludzie, którzy używają constructor pattern, zapomnieli użyć słowa kluczowego new. Jeśli zapomnisz użyć new podczas wywoływania funkcji konstruktora w ES3, this odwołuje się do obiektu globalnego (window w przeglądarce) i zatrzaśniesz obiekt globalny zmiennymi.

To było straszne zachowanie, więc ludzie w ECMA zdecydowali, po prostu ustawić this na undefined.

Przykład:

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

Ostatnia linijka rzuciłaby błąd w ES5 strict

"TypeError: this is undefined"

(co jest o wiele lepszym zachowaniem)

 87
Author: jAndy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-22 13:02:28

Istnieje mechanizm zwany "boksem", który zawija lub zmienia obiekt this przed wejściem w kontekst wywołanej funkcji. W Twoim przypadku wartość this powinna być undefined, ponieważ nie wywołujesz funkcji jako metody obiektu. Jeśli tryb nie jest ścisły, w tym przypadku jest on zastępowany przez obiekt window. W trybie strict jest zawsze bez zmian, dlatego jest undefined tutaj.

Możesz znaleźć więcej informacji na
https://developer.mozilla.org/en/JavaScript/Strict_mode

 13
Author: Samuel Rossille,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-22 13:06:29

Zgodnie z Ta odpowiedź przepełnienia stosu, możesz użyć this wewnątrz funkcji anonimowych, po prostu wywołując .call(this) na jej końcu.

(function () {
    "use strict";

    this.foo = "bar";
}).call(this);
 6
Author: ReverseTales,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:02