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).
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)
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
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);
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