this w 'strict mode'

Odpowiedz Nowy wątek
2018-12-06 14:38
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.

Pozostało 580 znaków

2018-12-06 14:48
2

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

https://developer.mozilla.org[...]rict_mode#Securing_JavaScript


((0b10*0b11*(0b10**0b101-0b10)**0b10+0b110)**0b10+(100-1)**0b10+0x10-1).toString(0b10**0b101+0b100);

Pozostało 580 znaków

2018-12-06 14:51

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?

edytowany 5x, ostatnio: Desu, 2018-12-06 15:01

Pozostało 580 znaków

2018-12-06 16:02
0

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

Pozostało 580 znaków

2018-12-06 16:32
0

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

Pozostało 580 znaków

2018-12-07 13:03
0

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

Zupełnie nie wiem czemu tak.

Pozostało 580 znaków

2018-12-07 14:34
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.

Pozostało 580 znaków

2018-12-07 16:29
0

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

Pozostało 580 znaków

2018-12-07 17:48
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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