[js] funkcja zwradajaca dane przez referencje

0

Witam

Mam problem z napisaniem kodu w js. Opisze to jak potrafię najlepiej, gdyż nie mam dostępu do właściwego kodu (został na innym komputerze). Chciałbym stworzyć obiekt posiadający pewne pola, powiedzmy wartosc1, wartosc2, wartosc3 i wartosc4, a następnie wywołać funkcję zmieniającą te wartości (wszystkie 4) przy użyciu instrukcji setInterval. Docelowo mają być to 4 obiekty i dla każdego chciałbym wywołać taką funkcję. Czy jest to możliwe ?

Z góry dzięki za odpowiedź.

0

Oczywiście, że tak -- bez problemu. Jeśli masz z czymś kłopot, to musisz to chyba jednak dokładniej opisać. Bo z obecnego opisu nie wynika, co tu może być nie tak. Nawet stosując podstawy JavaScriptu bez żadnych domknięć można to zrobić, zaśmiecając ewentualnie globalną przestrzeń nazw referencjami do obiektów (choć to niezalecane).

0

Moze faktycznie nie wiele z tego mozna wywnioskowac. Napisze schematycznie na czym polega moj problem.

Function init(){
function obiekt()
{
this.Wartosc1 = 1
this.Wartosc2 = 1
this.Wartosc3 = 1
this.Wartosc4 = 1

setInterval(rob_cos(this.Wartosc1,this.Wartosc2,this.Wartosc3,this.Wartosc4),500)
return this
}

Var nowy = new obiekt()
}

Function rob_cos(a,b,c,d)
{
a+=1
b+=1
c+=1
d+=1
}

Wiem ze w ten sposob nie ma szans na zwrocenie wartosci do obiektu ale od tego zaczalem i pozniej sie jakos zagubilem. Probowalem wszystko wrzucic jako globalne. Ogolnie to funkcja wywoluje sie raz oraz oczywiscie nie zmienia sie wartosc w obiekcie. SetInterval ustawialem osobno poza obiektem przy instancji ale efekt jest ten sam. Probowalem tez zamiast setInterval uzyc setTimeout rekurencyjnie i wykonywala sie funkcja wiele razy ale nie wiedzialem jak odniesc sie do elementow obiektu. Ogólnie to nie pamiętam dokładnie wszystkich kombinacji oraz sposobów na wykonanie tego, bo troche ich było. Główną przeszkodą było właśnie to, że nie znalazłem nigdzie jak zwrócić wartość przez referencję z funkcji. Zastanawiam się teraz czy dobrym sposobem byłkoby podanie jako argumentu funkcji tablicy argumentów i zwracanie jej przez return, ale nie wiem pod co to bym mógł przypisać. Mam nadzieję że chociaż troche czytelniej to napisałem. Jeśli dalej są jakieś nieścisłości to proszę o podanie ich w tym temacie. Bardzo zależy mi na szybkim rozwiązaniu tego problemu. Z góry dzięki za pomoc.

0

rob_cos(this.Wartosc1,this.Wartosc2,this.Wartosc3,this.Wartosc4) to jest wywołanie funkcji. Ta zwraca Ci undefined, więc masz coś takiego: setTimeout(undefined, 500). Oczywiście że z tego wyjść nic nie może. Rozwiązanie jest proste - użyć domknięcia:

setTimeout(function() {
  rob_cos(this.Wartosc1,this.Wartosc2,this.Wartosc3,this.Wartosc4)
}, 500);
0
 function init(){
	function obiekt(var1,var2,var3,var4)
	{
		this.Wartosc1 = var1
		this.Wartosc2 = var2
		this.Wartosc3 = var3
		this.Wartosc4 = var4

		return this
	}

	var nowy = new obiekt(1,2,3,4)
	setInterval(function() {
			alert(nowy.Wartosc1)
			rob_cos(nowy.Wartosc1,nowy.Wartosc2,nowy.Wartosc3,nowy.Wartosc4)
		}, 500);
}

function rob_cos(a,b,c,d)
{
	alert(a)
	a+=1
	b+=1
	c+=1
	d+=1
	alert(a)
}

Chyba mój poprzedni post też nie został zrozumiany. Do takiej sytuacji doszedłem (może nie odzwierciedla tego mój kod z poprzedniego postu lecz we właściwym kodzie udało mi się osiągnąć taki efekt). Chodzi mi o to, żeby teraz funkcja rob_cos zmieniła wartość dla elementu nowy tak, że przy każdym wywołaniu funkcji przez setInterval zwiększało wartość o 1. W tym przypadku zawsze argumentem dla funkcji jest 1, wartość zostaje zwiększona, ale po wyjściu z funkcji dalej wynosi 1. To jest właśnie mój główny problem. tutaj wstawiłem alert tylko dla pierwszej wartości, ale chciałbym, aby wszystkie zostały zwiększone po przejściu funkcji.

0

To zdefiniuj rob_cos w ten sposób:

function rob_cos(obiekt)
{
        alert(obiekt.a)
        obiekt.a+=1
        obiekt.b+=1
        obiekt.c+=1
        obiekt.d+=1
        alert(obiekt.a)
}

I wywołuj funkcję w ten sposób:

rob_cos(nowy);

W JavaScripcie wszystko jest przekazywane przez wartość, nie ma czegoś takiego jak przekazywania przez referencję. Choć jeśli przesyłasz obiekty, to przez wartość zostanie przekazana... referencja tych obiektów. Czyli gdy będziesz operował na przekazanym obiekcie, to zmiany będą widoczne poza funkcją.

0

Dzięki wielkie !!! Działa poprawnie w taki sposób (może komuś się jeszcze przyda):

function init(){
        function obiekt(var1,var2,var3,var4)
        {
                this.Wartosc1 = var1
                this.Wartosc2 = var2
                this.Wartosc3 = var3
                this.Wartosc4 = var4

                return this
        }

        var nowy = new obiekt(1,2,3,4)
        setInterval(function() {
                        alert(nowy.Wartosc1)
                        nowy = rob_cos(nowy)
                }, 500);
}

function rob_cos(ob)
{
        ob.Wartosc1+=1
        ob.Wartosc2+=1
        ob.Wartosc3+=1
        ob.Wartosc4+=1
        return ob
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1