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

Zagwostka z dziedziny funkcji - Samoreferencja?

Object Storage Arubacloud
0 głosów
209 wizyt
pytanie zadane 21 lipca 2017 w Rozwój zawodowy, nauka, praca przez Tomasz_Ek Nowicjusz (170 p.)
Spotkałem się ostatnio z pewnym nietypowym dla mnie zapisem funkcji. Korzystam z niego w swoich programach, ale nie do końca go rozumiem.

function xyz() {

var inside=this;

}

I otóż mam pytanie co to jest, jak się nazywa i na jakich zasadach działa. Zauważyłem też że poniższe zapisy nie są równoznaczne w moim programie i działa on tylko z tym pierwszym:

inside.hkc = inside.kol.out;

this.hkc = this.kol.out;

 

Pierwszy działa jak na leży, a drugi nie wyrzuca błędu, ale nie daje pożądanego efektu. Więc czym owo zjawisko jest?

1 odpowiedź

+1 głos
odpowiedź 22 lipca 2017 przez Comandeer Guru (601,110 p.)
wybrane 24 lipca 2017 przez Tomasz_Ek
 
Najlepsza

Warto, żebyś podał język, z którego pochodzą te przykłady… Jeśli to JS, to this można określić mianem "kontekstu wywołania", co jest bardzo złożonym tematem i bez sensownego przykładu niedziałającego kodu średnio da się to wytłumaczyć.

komentarz 22 lipca 2017 przez Tomasz_Ek Nowicjusz (170 p.)
Tak chodzi o JS. Przykładu niedziałającego kodu Ci nie podam, bo mój kod działa jak należy, nie rozumiem właśnie tylko tej kwestii z this. Kiedy napisze wewnątrz jakiejś funkcji "var i = this" to czym staje się to "i".
komentarz 22 lipca 2017 przez Comandeer Guru (601,110 p.)
Zależy od kontekstu wywołania – dlatego bez kodu nie da się wytłumaczyć ¯\_(ツ)_/¯
komentarz 22 lipca 2017 przez Tomasz_Ek Nowicjusz (170 p.)
var Obiect = {
    ini: function(data) {
        var player = new Obiect.helpers.Player(data.pics,0,0,64,128);
    }, 
    helpers: {
        Image: function(img, x, y, w, h) {
            this.img = img;
            this.x = x;
            this.y = y;
            this.w = w;
            this.h = h;
        },         
        Player: function(img, posX, posY, sizeW, sizeH) {
            var self = this;
            
            this.image = new Obiect.helpers.Player(img,0,0,64,128);
            this.animationFrame = {
                Right: {
                    frame: [new Obiect.helpers.Player(img,0,0,64,128),new Obiect.helpers.Player(img,64,0,64,128),
                                  new Obiect.helpers.Player(img,0,0,64,128),new Obiect.helpers.Player(img,128,0,64,128)],
                    frameCount: 0          
                },
                Left: {
                    frame: [new Obiect.helpers.Player(img,0,128,64,128),new Obiect.helpers.Player(img,64,128,64,128),
                                  new Obiect.helpers.Player(img,0,128,64,128),new Obiect.helpers.Player(img,128,128,64,128)],
                    frameCount: 0          
                }
            };
            this.state = {
                walking: {
                    move: function() {
                        if(self.direction === "right") {
                            self.posX+=self.velX;
                        } else if(wnetrze.kierunek === "left") {
                            self.posX-=self.velX;
                        }
                    },
                    
                    animation: function(data) {
                        if(self.direction === "right") {
                            if(data.NumberOfFrame % 5 === 0) {
                                self.image = self.animationFrame.Right.frame[self.animationFrame.Right.frameCount];
                                self.animationFrame.Right.frameCount++;
                                
                                if(self.animationFrame.Right.frameCount > 3) {
                                    self.animationFrame.Right.frameCount = 0;
                                }                                
                            }
                        } else if(self.direction === "left") {
                            if(data.NumberOfFrame % 5 === 0) {
                                self.image = self.animationFrame.Left.frame[self.animationFrame.Left.frameCount];
                                self.animationFrame.Left.frameCount++;
                                
                                if(self.animationFrame.Left.frameCount > 3) {
                                    self.animationFrame.Left.frameCount = 0;
                                }                                
                            }
                        }
                    }
                }
            };
            this.stateNow = self.state.walking;
            this.direction = "right";
            this.posX = posX;
            this.posY = posY;
            this.sizeW = sizeW;
            this.sizeH = sizeH;
            this.velX = 32;
        }
    }
}

var Engine = {
    ini: function() {
        var pics = new Image();
        pics.src = "img/stylesheet.png";
                
        pics.addEventListener("load", function() {
            var pics = this;
        });

        var data = {
            NumberOfFrame: 0,
            pics: pics
        };
        
        Engine.start(data);
    },
    start: function(data) {
        var z = function() {
            data.NumberOfFrame++;
            
            window.requestAnimationFrame(z);
        };
        
        z();
    }
}

window.onload = Engine.ini();

 

 

14 i 79 linijka kodu.

komentarz 23 lipca 2017 przez Comandeer Guru (601,110 p.)

W event listenerze (linia 79) this wskazuje na aktualnie wczytany obrazek (w event listenerach this domyślnie wskazuje na obiekt, do którego listener został doczepiony).

W linii 14 this wskazuje na obiekt stworzony przy pomocy tej funkcji (czyli w czasie wywołania new Player).

komentarz 24 lipca 2017 przez Tomasz_Ek Nowicjusz (170 p.)

Okej. Wiem że może jestem trochę upierdliwy, ale chce zrozumieć do końca. Np. w linijce 42 mam komende:

self.image = self.animationFrame.Right.frame[self.animationFrame.Right.frameCount];

Więc skoro self = this;

to zapis powinien być równoważny z 

this.image = this.animationFrame.Right.frame[this.animationFrame.Right.frameCount];

jednak nie jest. Moja animacja działa przy pierwszym zapisie z self, natomiast z this już nie. Dlaczego?

komentarz 24 lipca 2017 przez Comandeer Guru (601,110 p.)

A zauważ, gdzie jest to self zadeklarowane: powyżej this.state, więc odnosi się do this wewnątrz Player. Każda funkcja ma swoje własne this (oprócz tzw. arrow functions).

komentarz 24 lipca 2017 przez Tomasz_Ek Nowicjusz (170 p.)
Ok. Czyli w tym przypadku this odnosi się do funkcji animation, a self do całego obiektu Mario. Dzięki.

Podobne pytania

0 głosów
2 odpowiedzi 2,624 wizyt
pytanie zadane 30 października 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
0 głosów
1 odpowiedź 83 wizyt
+1 głos
0 odpowiedzi 334 wizyt
pytanie zadane 27 grudnia 2020 w C# przez Szyszka Gaduła (3,490 p.)

92,563 zapytań

141,413 odpowiedzi

319,590 komentarzy

61,948 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...