To w JavaScript

Słowo kluczowe this jest jedną z najbardziej mylących rzeczy, które zmusiły programistów JavaScript do zaczesania włosów do głowy. Moim zdaniem większość programistów interpretuje to słowo kluczowe tak, jak jego zachowanie w innych językach, takich jak Java. Cóż, w JavaScript sposób, w jaki to działa w innych językach, jest jednym z przypadków użycia. W tym poście na blogu przedstawię wszystkie zasady związane z tym słowem kluczowym w JavaScript.

W globalnym kontekście wykonania ta wartość jest równa obiektowi window. To samo dotyczy trybów ścisłych i nieścisłych w JavaScript.

Jednak w kontekście wykonania funkcji wartość tego słowa kluczowego zależy od sposobu wywołania funkcji. W JavaScript funkcję można wywołać na 4 różne sposoby.

Metoda 1: Normalne wywołanie funkcji

W tym scenariuszu ta wartość jest równa obiektowi globalnemu, którym jest okno w przeglądarce, oraz globalnemu w przypadku korzystania z NodeJS .

Natomiast undefined jest logowany do konsoli, jeśli używamy trybu ścisłego. Tryb ścisły jest włączany poprzez umieszczenie dyrektywy "use strict"na początku pliku lub funkcji.

Metoda 2: Wywołanie metody

Gdy wywoływana jest metoda obiektu, jest to równoznaczne z obiektem, który jest właścicielem metody. W poniższym przykładzie ta wartość jest równa obiektowi użytemu do jej wywołania, obj .

Metoda 3: Inwokacja pośrednia

Funkcje w JavaScript są jak obiekty. Są one bardziej szczegółowo nazywane obiektami wywoływanymi . Funkcje mają te dwie metody zdefiniowane w swoim prototypie; zadzwoń i aplikuj . Korzystając z tych metod, możemy ustawić wartość this . Gdy funkcja jest wywoływana przy użyciu metody wywołania i zastosowania , ta wartość jest równa pierwszemu argumentowi dostarczonemu do tych funkcji. W poniższym przykładzie jest to równe obiektowi obj w obu przypadkach.

Metoda 4: Wywołanie konstruktora

Gdy funkcja konstruktora jest wywoływana ze słowem kluczowym new , w takim przypadku ta wartość jest równa nowo utworzonej instancji.

to w funkcjach strzałek

Słowo kluczowe this zachowuje się zupełnie inaczej w funkcjach strzałek niż w zwykłych funkcjach. Funkcje strzałek nie mają własnego kontekstu wykonania. W praktyce jest to dziedziczone z zewnętrznej otaczającej funkcji lub kontekstu. Na przykład,

W powyższym przykładzie jest to dziedziczone z globalnego kontekstu wykonania. Wartość this jest równa obiektowi window w globalnym kontekście wykonania w przeglądarce. Zobaczmy inny przykład.

Jak dotąd ustaliliśmy, że funkcje strzałek nie mają własnego kontekstu wykonania. Zatem w powyższym przykładzie ta wartość jest równa otaczającemu kontekstowi, który jest globalnym kontekstem wykonania. W rezultacie ta wartość jest równa obiektowi okna. Obiekt window nie posiada właściwości name , co prowadzi do niezdefiniowanych danych wyjściowych w powyższym przykładzie.

Naprawianie problemów z wiązaniem

Rozważ ten przykład,

Dlaczego otrzymujemy niezdefiniowane jako wyjście? Okazuje się, że straciliśmy to powiązanie z obiektem obj . Zauważ, że w linii 8. nie wywołujemy funkcji printName . Przechowujemy jego odwołanie w zmiennej, aby użyć go później. Wywołanie funkcji i przechowywanie jej referencji w zmiennej to dwie różne rzeczy. Więc kiedy wywołujemy funkcję w linii 9, otrzymujemy undefined jako wyjście. Ponieważ obiekt nie jest określony, powiązanie this z obiektem obj zostanie utracone. Prowadzi to do zrównania się z obiektem globalnym . Ponieważ nie ma imieniaw obiekcie globalnym otrzymujemy undefined na konsoli.

Jak możemy zachować to powiązanie funkcji printName , tak że wartością this jest zawsze obiekt obj , niezależnie od tego, czy wywołujemy funkcję printName ?

Można to łatwo naprawić za pomocą metody bind w prototypie funkcji. Metoda bind zwraca nową funkcję z tym słowem kluczowym ustawionym na określoną wartość. W przeciwieństwie do metod call i apply , funkcja nie jest wywoływana natychmiast. Dlatego później użyjemy zwróconej funkcji metodą bind .

Metoda bind naprawia to powiązanie funkcji printName z obiektem obj .

Mam nadzieję, że ten post okazał się pomocny. Dziękuje za przeczytanie. :)

Połączmy się:
LinkedIn
Twitter

Suggested posts

Zabójstwo Jordana Neely'ego i problem „patriotycznego” rasizmu

Czy Stany Zjednoczone mogą zrobić zasadniczy krok, by nie utożsamiać zachowania rasistowskiego z byciem dobrym Amerykaninem?

Zabójstwo Jordana Neely'ego i problem „patriotycznego” rasizmu

[Ostrzeżenie: ten esej zawiera zrzuty ekranowe ludzi wychwalających mordercę Jordana Neely'ego.] Funkcjonariusze organów ścigania w końcu - i być może niechętnie - oskarżyli Daniela Penny'ego, człowieka, który dusił Jordana Neely'ego aż do śmierci, o to zabójstwo.

Wyzwanie czytelnicze Goodreads jest toksyczne

Wyzwanie czytelnicze Goodreads jest toksyczne

Swędzenie w mojej dłoni rozszerzyło się, gdy targowałem się z miejscowym księgarzem o kolejną książkę. Ta książka, podobnie jak pozostałe, które ostatnio kupiłem, znalazłaby swój tron ​​na moim stosie „Do przeczytania” (TBR); a mimo to kupiłem.

Related posts

Śledź każdego, kto ma tylko numer telefonu | Śledztwo OSINT

Śledź każdego, kto ma tylko numer telefonu | Śledztwo OSINT

Możesz być śledczym OSINT, graczem CTF lub po prostu kimś, kto odbiera połączenia spamowe. Ktoś, kto próbuje zweryfikować numer, który widziałeś w reklamie.

3 sprawdzone sposoby na poprawę umiejętności pisania

Korzyści płynące z pisania i strategie, które Ci w tym pomogą

3 sprawdzone sposoby na poprawę umiejętności pisania

W 2022 roku, wraz z wydaniem GPT-3, umiejętność pisania wydaje się tracić na znaczeniu. Dzięki sztucznej inteligencji osoby o słabym pisaniu mogą również generować wysokiej jakości personel.

Nauka w tygodniu pracy ma większe znaczenie niż myślisz

Nauka w tygodniu pracy ma większe znaczenie niż myślisz

Często mamy trudności z wdrożeniem tego, co wiemy, że jest dla nas dobre. Od mówienia drugiej osobie, że ją kochamy, po pamiętanie, by mówić jak pirat, zawsze znajdą się tacy, którzy twierdzą, że dzień, tydzień lub miesiąc wydarzeń nie jest potrzebny, ponieważ już to robią.

Co wpływa na podcast?

Co wpływa na podcast?

W zeszłym tygodniu zauważyłem komunikat prasowy, wysłany za pośrednictwem PressGazette (brytyjski serwis informacyjny). W artykule ogłoszono, że Acast, skandynawska firma hostingowa i reklamowa podcastów, będzie przewodzić konsorcjum „prawdopodobnie najbardziej wpływowych” wydawców podcastów.