Skok z jednej do drugiej funkcji w JavaScript

1

Witam,

Czy możliwe jest wykonanie czegoś takiego jak skok z jednej funkcji do innej wraz z przekazaniem parametru? Chodzi mi o taką sytuację:

function funkcjaPierwsza(){
	var zmienna1;
	zmienna1 = prompt("Podaj liczbę do 100: ");
	if (zmienna1 < 0 || zmienna1 > 100){
		alert("Niepoprawna liczba");
	} else {
		funkcjaDruga(zmienna1);
	}
}

function funkcjaDruga(zmienna1){
	alert("Podałeś poprawną liczbę! Oto ona: " + zmienna1);
}

Wiem, że można zrobić to bez tej drugiej funkcji, ale chodzi mi o przypadki, gdzie w tej drugiej dzieje się nieco więcej niz sam alertbox ;)

0

tak trochę kontrowersyjnie, ale

flaga + goto?

W js nie ma goto :o

2

Możliwe. Normalne. Wskazane.
Co tu budzi wątpliwość?
To jest normalne wywołanie funkcji.

0
jarekr000000 napisał(a):

Możliwe. Normalne. Wskazane.
Co tu budzi wątpliwość?
To jest normalne wywołanie funkcji.

OK, w takim razie sytuacja docelowa wygląda mniej więcej tak i to nie chce działać:

var answers  = [];

userPrompt();

function checkIfExists(answer){
	var i = 0;
	for (i = 0; i < answers.length; i++){
		if (answers[i] == answer && answers[i] != null && answers[i] != undefined){
			alert("Podaj inną liczbę! Tę już znam.");
			userPrompt();
		} else {
			answers.push(answer);
			userPrompt();
		}
	}
}

function userPrompt(){
	var answer;
	answer = prompt("Podaj liczbę z zakresu od 0-100):");
	if (answer < 0 || answer > 100) {
        alert("Niepoprawna liczba!");
	} else {
		checkIfExists(answer);
	}
}
0

OK, teraz postanowiłem wykorzystać zdobytą wiedzę i zrobiłem prostą grę w statki. Jest tylko jeden problem. Wszystko działa do momentu, w którym poda się dwukrotnie tę samą wartość, wtedy gra powinna to wychwycić i zwrócić komunikat (tak się dzieje). Problem leży w momencie zakończenia gry. Trafiam kolejno trzy razy w odpowiednie miejsce, dostaję komunikat o zakończeniu gry, podsumowanie, a następnie w zależności od tego, którą wartość podam więcej niż raz, dostaję komunikat o trafieniu bądź pudle i gra się zapętla. Prześledziłem całość za pomocą debuggera w Firefoxie i z niewiadomych mi przyczyn, program po przejściu przez instrukcje z wyświetleniem wyników gry, wraca znowu do funkcji. Oto całość kodu:

var location1 = 3;
var location2 = 4;
var location3 = 5;

var hits = 0;
var guesses = 0;

var answers = [];

userPrompt();

function checkIfExists(guess){
	var i = 0;
	for (i = 0; i < answers.length; i++){
		if (answers[i] == guess && answers[i] != null && answers[i] != undefined){
			alert("Tu już strzelałeś, podaj inną liczbę!");
			userPrompt();
		}
	}
	answers.push(guess);
	fire(guess);
}

function userPrompt(){
	var guess;
	guess = prompt("Gotów, cel, pal! (podaj liczbę z zakresu od 0-6):");
	if (guess < 0 || guess > 6 || isNaN(guess)){
        alert("Proszę podać prawidłowy numer komórki!");
		userPrompt();
	} else {
		checkIfExists(guess);
	}
}

function fire(guess){
	guesses = guesses + 1;
	if (guess == location1 || guess == location2 || guess == location3){
		alert("Trafiony!");
		hits = hits + 1;
		if (hits == 3){
			alert("Gratulacje! Zatopiłeś okręt!");
			score();
		} else {
			userPrompt();
		}
	} else {
		alert("Pudło!");
		userPrompt();
	}
}

function score(){
	var stats = "Potrzebowałeś " + guesses + " prób, by zatopić okręt, " +
				"czyli Twoja efektywność wynosi: " + (3/guesses) + ".";
	alert(stats);
}

Jak pominę funkcję checkIfExists(), to wtedy działa poprawnie, ale strzał w to samo miejsce trzy razy powoduje to, że gra się kończy, tym razem prawidłowo, także problem leży w tej funkcji.

0

Powiedzialem Ci jak sprawdzic czy lista zawiera dany element a Ty dalej brniesz w ta petle...

let asd = [];

...

asd.includes(5); //true or false, ES7 wiec IE/edge nie obsluguje

asd.indexOf(5); //index pierwsxego wystapienia lub -1 jesli brak elementu

A wywolanie innej funkcji nie przerywa pstli stad Twoje problemy

0
stivens napisał(a):

Powiedzialem Ci jak sprawdzic czy lista zawiera dany element a Ty dalej brniesz w ta petle...

let asd = [];

...

asd.includes(5); //true or false, ES7 wiec IE/edge nie obsluguje

asd.indexOf(5); //index pierwsxego wystapienia lub -1 jesli brak elementu

A wywolanie innej funkcji nie przerywa pstli stad Twoje problemy

OK, zrobiłem tak jak powiedziałeś:

function checkIfExists(guess){
	if (answers.includes(guess) == true){
			alert("Tu już strzelałeś, podaj inną liczbę!");
			userPrompt();
		}
	answers.push(guess);
	fire(guess);
}

I jest to samo. Nie ma nigdzie żadnej pętli, a mimo tego po dwukrotnym strzale w to samo miejsce i późniejszym zatopieniu okrętu, gra nadal zachowuje się identycznie jak wyżej opisałem.

0

Przeciez wywolujesz dalsza czesc funkcji... Wywolanie innej funkcji nie przerywa checkIFExists, wiec po wszystkim fire i tak sie wykonuje. Musisz to dac w else

0
stivens napisał(a):

Przeciez wywolujesz dalsza czesc funkcji... Wywolanie innej funkcji nie przerywa checkIFExists, wiec po wszystkim fire i tak sie wykonuje. Musisz to dac w else

OK, teraz faktycznie zadziałało jak należy. Zastanawiam się już (tak tylko dla siebie, uczę się i chciałbym poznać mechanizmy), czy da się przerobić ten kod tak, aby wykorzystać pętlę FOR, czyli to co pierwotnie zrobiłem. Rozumiem, że należy sobie upraszczać i nie wyważać otwartych drzwi, ale w ramach ćwiczenia i nauki chciałem spróbować pobawić się tym.

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