• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zasięg this?

0 głosów
892 wizyt
pytanie zadane 20 czerwca 2019 w JavaScript przez 42savage Bywalec (2,630 p.)

Witam, witam

Ostatnio bawię się z galerią zdjęć i napotkałem się z małym problemem, otóż próbuje każdą czynność podzielić na poszczególne funkcje.

I problem tkwi w używaniu this

Mam tablicę z img, na której działam, jako eventListener dodałem funkcje inicjującą, a w funkcji inicjującej dwie funkcje, jedną odpowiedzialną za pobranie źródła zdjęcia, druga zaś za stworzenie kontenera, który będzie się pojawiał na całym ekranie i pokazywał owe zdjęcie tyle, że w większej rozdzielczości.

var image = document.querySelectorAll('.item');
image = [...image];
image.forEach( fullResInit );

function fullResInit(e){
    e.addEventListener("click", init);
}
function init(){
    createContainer();
    getSrc();
}
function getSrc(){
    console.log(this);
}

function createContainer(){
    var container = document.createElement('div');
    container.className = "imageContainer";
    document.body.appendChild(container);
    var toggleButton = document.createElement('button');
    toggleButton.className = "toggleButton";
    container.appendChild(toggleButton);
    toggleButton.innerHTML = "ZAMKNIJ";
    toggleButton.addEventListener("click", ()=>{
        container.remove();
    });
}

Funkcja napisana w ten sposób nie działa (w pewien sposób działa, bo pokazuje się w konsoli wartość undefined), nie wiem jak miałbym odnieść się do tablicy image.

function getSrc(){
    console.log(this);
}

Gdy w funkcji inicjującej ustawie console loga

    console.log(this);

wszystko śmiga, jakiś pomysł jak sobie z tym poradzić?

 

1 odpowiedź

+1 głos
odpowiedź 20 czerwca 2019 przez adrian17 Mentor (354,880 p.)
wybrane 21 czerwca 2019 przez 42savage
 
Najlepsza

jakiś pomysł jak sobie z tym poradzić?

Proponuję ogólnie zmniejszyć użycie `this` - im głębiej w funkcje się wchodzi, tym trudniej kontrolować to czym jest. Zamiast tego, można po prostu przekazywać element jako argument:

function fullResInit(e){
    e.addEventListener("click", e => init(e.currentTarget));
}
function init(element){
    getSrc(element);
}
function getSrc(element){
    console.log(element);
}

 

1
komentarz 21 czerwca 2019 przez ScriptyChris Mędrzec (190,190 p.)

Albo, jeśli koniecznie potrzebne jest użycie this, można wołać funkcję ze z góry ustawionym this:

function init(){
    createContainer();
    getSrc.call(this);
}

Alternatywnie, gdy init() będzie funkcją strzałkową, można posłużyć się własnie e.currentTarget lub e.target (w zależności, czy potrzeba elementu, pod który podpięty jest listener, czy tego na którym zostało dispatchowane zdarzenie) jako this dla funkcji getSrc():

const init = (e) => {
    createContainer();
    getSrc.call(e.currentTarget); // e.currentTarget będzie ustawione jako this wewnątrz funkcji getSrc()
};

 

Podobne pytania

0 głosów
1 odpowiedź 324 wizyt
pytanie zadane 30 grudnia 2018 w JavaScript przez niezalogowany
+1 głos
1 odpowiedź 360 wizyt
pytanie zadane 20 sierpnia 2023 w Sieci komputerowe, internet przez Tharek Nowicjusz (130 p.)
0 głosów
1 odpowiedź 617 wizyt
pytanie zadane 17 kwietnia 2022 w Sieci komputerowe, internet przez Pakiś Nowicjusz (120 p.)

93,691 zapytań

142,610 odpowiedzi

323,216 komentarzy

63,218 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...