this w 'strict mode'

0

Cześć!

Napisałem pewną metodę która w strict mode zachowuje się dość nietypowo.
https://jsfiddle.net/vno7jdrf/

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. ?

PS: Wiem że mogę tam użyć funkcji strzałkowych.

2

Sam sobie odpowiedziałeś chyba? Od tego (między innymi) jest strict mode, żeby takie rzeczy robił:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#Securing_JavaScript

2

Pierwsza funkcja, ta z setTimeout:

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.

źródło

Czyli można powiedzieć, że Twój callback jest odpalany tak:

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.

źródło

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?

0

Czy znasz może jeszcze jakieś wbudowane funkcje wyższego rzędu które zachowują się podobnie do setTimeout() ? [ fn.apply(window) ] ?

0

Pewnie setInterval, a poza nim, to nie wiem. Sprawdziłbym Promise.

0

Znalazłem przypadek w którym setTimeout znowu zachowuje się zupełnie inaczej:
https://jsfiddle.net/ew2xonr8/

Zupełnie nie wiem czemu tak.

0
adams0 napisał(a):

Znalazłem przypadek w którym setTimeout znowu zachowuje się zupełnie inaczej:
https://jsfiddle.net/ew2xonr8/

Zupełnie nie wiem czemu 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.

0

Masz racje!
Próbowałem po return wpisać cokolwiek innego:
https://jsfiddle.net/ew2xonr8/1/
i dalej undefined. Czemu tak się dzieje?

1

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.

https://eloquentjavascript.net/11_async.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1