Dlaczego w funkcji anonimowej jest to niezdefiniowane, gdy używasz javascript w trybie ścisłym? Rozumiem, dlaczego to może mieć sens, ale nie mogłem znaleźć żadnej konkretnej odpowiedzi.
Przykład:
(function () {
"use strict";
this.foo = "bar"; // *this* is undefined, why?
}());
Testuj na skrzypcach: http://jsfiddle.net/Pyr5g/1/ Sprawdź loggera (firebug).
javascript
anonymous-function
use-strict
T. Junghans
źródło
źródło
Odpowiedzi:
To dlatego, że aż do ECMAscript 262 wydanie 5 było duże zamieszanie, gdy ludzie, którzy używali
constructor pattern
, zapomnieli użyćnew
słowa kluczowego. Jeśli zapomniałeś użyć funkcjinew
podczas wywoływania funkcji konstruktora w ES3, odwołałeś sięthis
do obiektu globalnego (window
w przeglądarce) i zrzuciłbyś obiekt globalny zmiennymi.To było okropne zachowanie, więc ludzie z ECMA zdecydowali się po prostu na
this
toundefined
.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 linia spowodowałaby błąd w ES5 strict
"TypeError: this is undefined"
(co jest znacznie lepszym zachowaniem)
źródło
this === window
jest myląca i przecieka globalny zasięg jako symbol funkcjiIstnieje mechanizm zwany „boksowaniem”, który zawija lub zmienia
this
obiekt przed wejściem w kontekst wywoływanej funkcji. W twoim przypadku wartośćthis
powinna być taka,undefined
ponieważ nie wywołujesz funkcji jako metody obiektu. W tym przypadku w trybie innym niż ścisły jest to zastępowane przezwindow
obiekt. Wstrict
trybie jest zawsze niezmieniony, dlatego jestundefined
tutaj.Więcej informacji można znaleźć pod
adresem https://developer.mozilla.org/en/JavaScript/Strict_mode
źródło
Zgodnie z odpowiedzią This Stack Overflow , możesz używać
this
wewnątrz funkcji anonimowych, po prostu wywołując.call(this)
na końcu.(function () { "use strict"; this.foo = "bar"; }).call(this);
źródło
this
będzie toWindow
obiekt w tym przypadku, co może nie być pożądane