Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Niby oba callbacki są spoza obiektu ale mają inne this...
Bardzo proszę was o wyjaśnienie mi dla czego jedna z metod zwraca undefined a druga obiekt window. ?
The setTimeout() method must return the value returned by the timer initialization steps, passing them the method's arguments, the object on which the method for which the algorithm is running is implemented (a Window or WorkerGlobalScope object) as the method context, and the repeat flag set to false.
Czyli można powiedzieć, że Twój callback jest odpalany tak:
Kopiuj
fn.apply(window); // a nie fn();
W drugim przypadku sprawa wygląda tak:
If a thisArg parameter is provided, it will be used as the this value for each invocation of callbackfn. If it is not provided, undefined is used instead.
Nie przekazujesz this'a, więc jest użyta domyślna wartość - undenfined (ponieważ zgodnie z strict mode, nie może być użyty jakiś "dziwny" this). Oczywiście tak to działa tylko w wypadku użycia strict mode. Jak go wyłączysz, to this nie zostanie ustawiony na undefined, tylko będzie window. Dlaczego tak?
Wszystko tutaj działa dobrze. W tym objectt.one w środku setTimeout zrób console.log(this) to zobaczysz, że jest tam ten sam object. Po prostu ten twój alert wywołujesz od razu a ta funkcja nic nie zwraca w tej chwili.
Dlatego, że wykonanie kodu - jak życie - biegnie cały czas do przodu. JavaScript nie czeka, aż Twoja funkcja się wykona tylko leci dalej. Twoja funkcja zwraca undefind (ponieważ nie zwracasz nic jawnie). Nie ma znaczenia co zwrócisz wewnątrz funkcji w setTimeout. Wyobraź sobie, że ona jest brana i wywoływana zupełnie gdzie indziej za jakiś tam czas.