Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [javascript]Nadpisywanie zmiennych w funkcji
Forum PHP.pl > Forum > Po stronie przeglądarki
Volume
Witam
Mam taki problem, nie wiem jak przekazac zmieniajaca sie zmienną w funkcji.
Już tłumacze o co mi chodzi...
Efekt mojego kodu jest taki, ze przekazuje sie zmienna wstepnie zdeklarowana i przekazana do funkcji (w przykladzi pomoc1 / pomoc2), natomiast funkcja juz tej zmiennej nie nadpisuje wg instrukcji...
Czy ktos wie jak poprawnie to sformułowac?

Przyklad:
Kod
var pomoc1=0;
var pomoc2=0;

odb(pomoc1);

odb(pomoc2);

function odb(pomocnik)
{
    if(pomocnik==0) //wykonuje sie tylko do pierwszej deklarcja
    {
       if (jakis_warunek) {
       //jakis kod
       }
       else pomocnik=1; //to nadpisanie nie chce dzialac
    }
    else // tym samym ta czesc sie w ogole nie wykonuje
    {
        if (jakis_warunek)
        {
        //jakis kod
        }
        else pomocnik=0;
    }
}
tolomei
Witaj.

Nie jestem pewien, czy to najlepsze rozwiązanie, ale wiem że działa.

[JAVASCRIPT] pobierz, plaintext
  1. var pomoc1=0;
  2. var pomoc2=0;
  3.  
  4. odb('pomoc1', this);
  5.  
  6. odb('pomoc2', this);
  7.  
  8. function odb(pomocnik, obiekt) {
  9. if(obiekt[pomocnik]==0) {
  10. if (false) {
  11. //jakis kod
  12. } else {
  13. obiekt[pomocnik]=1;
  14. }
  15. } else {
  16. if (false) {
  17. //jakis kod
  18. } else {
  19. obiekt[pomocnik]=0;
  20. }
  21. }
  22. }
[JAVASCRIPT] pobierz, plaintext


Modyfikowałeś zmienną lokalną, a nie tą, którą przekazałeś w parametrze.
Raczej unikaj pisania kodu w zasięgu globalnym. Poczytaj o funkcjach natychmiastowych.
Jak otwierasz klamry - rób to w tej samej linii kodu - w JS to czasami jest zgubne.

Pozdrawiam.
kamil4u
Nie za bardzo wiem co Ci nie działa/działa. W skrócie co chcesz osiągnąć.

Prawdopodobnie chodzi o: zmienne globalne lub return.

Kod
var y;
y = 5;
alert(y);
y = test(y);
alert(y);

function test( x ){
return x+2;
}
tolomei
Witaj kamil4u!

Volume chciałby użyć funkcji tak jakby przekazywał referencję do zmiennej. Czyli, że wszystkie operacje wewnątrz funkcji zmienią przekazaną w parametrze zmienną.

Pozdrawiam
PrinceOfPersia
najprostszy sposósb to chyba "owinac" zmienne w jednoelementowa tablicę przy podawaniu ich do funkcji (bo tablice są zawsze w JS przekazywane przez referencję, tak samo jak obiekty i funkcje. Liczby i napisy zas są niestety przekazywane tylko przez wartość).
czyli zamiast robic:
Kod
var zmienna = 14,

rozbisz
Kod
var zmienna = [14];

i traktujesz zmienna jako 1-elementowa tablice i jak chcesz sie do niej dostac to przez nawiasy kwadratowe, po której wpisujesz liczbę zero:
Kod
alert(zmienna[0]) /* wyswietli "14"*/


jednak przy samym przekazywaniu do funkcji, piszesz juz bez nawiasow kwadratowych. Dzięki temu przekażesz do funkcji jednoelementową tablicę ze zmienną w środku:
Kod
jakasFunkcja(zmienna);

function jakasFunkcja(zmienna) {
  alert("Zmienna: " + zmienna[0]);
  zmienna[0] = 25;
}


//drugie rozwiazanie, wymagajace nieco pisania, ale za to bardzo proste przy późniejszym uzyciu to opakowanie zmienną w funkcję (za pomocą tzw. closure):
Kod
function robZmienna(wartoscPoczatkowa) {
    var zmienna = wartoscPoczatkowa;
    return function getSet(nowaWartosc) {  
        if (typeof nowaWartosc != 'undefined')
            zmienna = nowaWartosc;
        return zmienna;                
    }
}

a potem zamiast podawac bezposrednio zmienna, podajemy do funkcji getter/setter do zmiennej.

Kod
function robCos(getSet) {
    // funkcja getSet dziala troche jak funkcje jQuery:
    // foo() bez parametru zwraca aktualna wartosc, foo(5) ustawia wartosc na 5
    alert("w srodku funkcji, zmienna wynosi:  " + getSet());
    getSet(5);
}

var pomoc1 = robZmienna(0);
alert("zmienna przed zmiana: " + pomoc1() );
robCos(pomoc1);
alert("zmienna po zmianie: " + pomoc1() );  
robCos(pomoc1);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.