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

question-closed JS referencja

Object Storage Arubacloud
0 głosów
327 wizyt
pytanie zadane 4 marca 2023 w JavaScript przez TOWaD Mądrala (5,700 p.)
zamknięte 9 marca 2023 przez TOWaD

Czy takie coś jet możliwe w JS penie nie, ale chciałbym się upewnić.

function f1(){
        let arr = ['red','green','blue'];
        return {arr};
    }
    function f2(arr = f1().arr){
       arr.push('yellow');
       //lub
       // f1().arr.push('yellow');
    }
    f1();
    f2();
    console.log("arr2=",f1().arr); //[ "red", "green", "blue", "yellow" ] <- log konsoli

pracować na arr jak na globalnej tablicy.

komentarz zamknięcia: Rozwiązane, choć prawie zwątpiłem w funkcje JS
komentarz 5 marca 2023 przez ScriptyChris Mędrzec (190,190 p.)
Co wirtualna maszyna albo przeglądarka mają do tematu? Zadałeś pytanie o sam język JavaScript.
komentarz 5 marca 2023 przez TOWaD Mądrala (5,700 p.)

Przeglądarka i dysk nie wystarczą do stosowania modów w tym pytaniu to już było.

1
komentarz 5 marca 2023 przez ScriptyChris Mędrzec (190,190 p.)

Dobrze jest od razu opisać takie szczegóły projektu, żeby znany był szerszy kontekst pytania. Niemniej, moduł możesz też stworzyć poprzez IIFE (podlinkowałem wyżej). Tylko, że jeśli chcesz go współdzielić pomiędzy skryptami, to nie obędzie się bez wystawienia go w globalnym scope.

komentarz 5 marca 2023 przez TOWaD Mądrala (5,700 p.)

ps.

W jakim sensie state nie działa?

https://forum.pasja-informatyki.pl/577586/zabawa-z-canvas-i-javascript-gra-mastermind

game () { to co Pan Mirek zrobił z przeróbkami }

( (...) => { state wymaga oryginału bo inaczej jest // ['empty',....,'empty']

})();

komentarz 9 marca 2023 przez TOWaD Mądrala (5,700 p.)
Dzięki za poświęcony czas.

1 odpowiedź

+1 głos
odpowiedź 4 marca 2023 przez Wiciorny Ekspert (270,170 p.)
wybrane 10 marca 2023 przez TOWaD
 
Najlepsza

Nie jest to możliwe, i nie zostanie dodany  kolor yellow
Gdyż wewnątrz pracujesz na kopii referencji, a nie na "bezpośrednim obiekcie" i ta kopia jest tylko dostępna lokalnie
Więc przypisanie czegoś do kopii nic nie zmieni. Nie jest to dokładnie ten sam obiekt, a kopia samej referencji do niego
Chociaż tutaj może byc kopia wartości samej, nie referencji, nie wiem jak to jest z przekazywaniem w JS czy przez ref. czy wartość, mimo że to tablica powinno być kopią referencji

Wynik bedzie 

Tzw: Call by sharing w js działa, wszystko jest wartością https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing

"arr2=",  ["red", "green", "blue"] 

Jako ze to tablica w przypadku takiej zmiennej  kopiuje się referencja do wartości. ale nie bezpośrednio do obiektu 

komentarz 5 marca 2023 przez TOWaD Mądrala (5,700 p.)
Myślałem że jak funkcja to obiekt to prototype lub this.state załatwi sprawę
komentarz 5 marca 2023 przez Wiciorny Ekspert (270,170 p.)
tak, tylko gdy tablice tworzysz w  "lokalnym" scope,  to  tak naprawdę tworzysz go jedynie na stosie tzn życie obiektu jest w granicach stosu - jako dostęp mimo, że obiekty są na stercie tzn referencje do nich są trzymane na stosie obiektu funkcyjnego i zaraz po opuszczeniu referencje przestaje istnieć, a wraz z nim obiekt gdyż jest on lokalny.
komentarz 5 marca 2023 przez Wiciorny Ekspert (270,170 p.)

więc zaraz po tym jak wykonałeś funkcje f(1), obiekt przestaje istnieć, w momencie kiedy wywolujesz f2(), obiekt znowu jest utworzony jako przekazanie go - i kopia refreencji do f1().arr istnieje tylko lokalnie, po wykonaniu kiedy robisz console.log - znowu odwolujesz sie do obiektu f1, który w momencie wywołania tworzy Ci tablice.

 

function f1(){
   console.log("runned")
        let arr = ['red','green','blue'];
        return {arr};
    }
    function f2(arr = f1().arr){
       arr.push('yellow');
       console.log(arr)
       //lub
       // f1().arr.push('yellow');
    }

runned woknalo sie 3 razy, i to  3 razy powstala nowa tablica

1
komentarz 5 marca 2023 przez TOWaD Mądrala (5,700 p.)
Dzięki czyli żadne var arr i this.arr  nie pomoże. (var tworzone jest globalnie tak jak this), tylko trzeba użyć klasy. A i jeszcze się wczytam w te Wiki co przesłałeś.
komentarz 5 marca 2023 przez Wiciorny Ekspert (270,170 p.)
zabawnie mógłbyś oczywiście dla siebie i celów praktycznych wykorzystywać przechowywanie tego w LocalStorage, co oczywiście nie powinno miec miejsca, ale jak lubisz dłubać to fajnie spojrzeć
https://stackoverflow.com/questions/3357553/how-do-i-store-an-array-in-localstorage
dodatkowo musiałbyś pamiętać o konwersji tego za każdym razem na string i spowrotem,  natomiast var- działa jedynie jako deklaracja globalna, może być omyłkowe dalej, ale nadal widoczność może będzie globalna, ale zachowanie już nie.

https://sentry.io/answers/difference-between-let-and-var-in-javascript/#:~:text=The%20difference%20between%20let%20and,in%20which%20they're%20declared.
komentarz 5 marca 2023 przez TOWaD Mądrala (5,700 p.)
Dzięki dam najlepszą.

Bo w sumie mam odpowiedź - nie da się.

A generalnie mi chodziło oto by przy małych przeróbkach, pozbyć się zmiennych globalnych.

Po co? Mam jakiś JS i działa fajnie, i chcę np dodać do innego JS. I co? nazwy zmiennych się pokrywają i zaczyna się grzebanie. A im bardzej rozbudowane tym grzebania więcej.
komentarz 9 marca 2023 przez TOWaD Mądrala (5,700 p.)
edycja 9 marca 2023 przez TOWaD

Jednak cofnąłem  najlepszą, bo na funkcjach też da się zrobić nie trzeba klas.

   signal(slot());
        function slot(){
            let i=0;
            this.y=0;
            this.array=['green','white'];
            function f1 () {array.push('red',i++);}
            function f2 () {console.log('hello',y++);}
            console.log('f1');
            function f3 () {;};
            return {array,f1,f2,f3}
           
        };

        function signal(obj){
               let f1= ()=>obj.f1();
               let f2=()=> obj.f2();
               let array=obj.array;
               
               f1();
               f1();

            console.log("array",obj.array);
            console.log("arr1=",array);
            console.log(f2());
        };

Edit:: Dzięki @Wiciorny za poświęcony czas i komentarze, niestety chodziło mi o takie rozwiązanie, powyżej na szybkie zrobienie z globalnych zmiennych, ziemne lokalne.

Podobne pytania

0 głosów
2 odpowiedzi 580 wizyt
pytanie zadane 28 marca 2016 w C i C++ przez Barus Stary wyjadacz (14,120 p.)
+1 głos
1 odpowiedź 1,569 wizyt
pytanie zadane 9 maja 2021 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
0 głosów
4 odpowiedzi 1,143 wizyt
pytanie zadane 21 lutego 2017 w C i C++ przez Danthee Początkujący (260 p.)

92,575 zapytań

141,424 odpowiedzi

319,650 komentarzy

61,961 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!

...