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

question-closed Zmienna nie jest dostępna w funkcji, choć została zdefiniowana wcześniej (nie w innej funkcji)

Cloud VPS
0 głosów
243 wizyt
pytanie zadane 26 czerwca 2018 w JavaScript przez bk20 Użytkownik (740 p.)
zamknięte 26 czerwca 2018 przez ScriptyChris

Witam,

pisząc program do losowania liczby, która nie może się powtarzać za jednym jego działaniem (losowana liczba nie może być powtórzona z poprzednimi), natknąłem się na problem. Mianowicie zdefiniowałem zmienną poza jakąkolwiek funkcją, a następnie chciałem się do niej odwołać przez funkcję właśnie, ale wyskoczył błąd:

Uncaught ReferenceError: numbers is not defined
    at isInArray (index.html:34)
    at randomize (index.html:45)
    at index.html:27

Kod umieszczony na pastebin'ie pod linkiem (klik), lub w kodzie:

<!DOCTYPE html>
<html>
	<head>
		<title>Jakiśtam tytuł</title>
		<meta charset="utf-8" />
		<!-- Import CSS -->
		<link rel="stylesheet" type="text/css" href="style.css" media="all" />
		<!-- device-width -->
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<!-- Import FONTS -->
		<link href="https://fonts.googleapis.com/css?family=Markazi+Text|Roboto:400,900" rel="stylesheet">
	</head>
	<body>
		<div class="centered">
			<p class="number">0</p>
			<h1>Wylosuj numerek</h1>
			<p class="warning">Uwaga! Wartości z pól są uważane za maksymalne w każdą stronę. Oznacza to, że po wybraniu przedziału od 1 do 20 mogą zostać wylosowane liczby 1, 2, .. , 19, 20</p>
			<label for="number-min">Od</label><br />
			<input type="number" id="number-min" /><br />
			<label for="number-max">Do</label>
			<br /><input type="number" id="number-max" />
		</div>
		<script>
			for(var i = 0; i < 30; i++) {
				document.write(randomize(1, 20) + ', ');
			}

			let numbers = new Array(1, 2);
			var rndm;

			function isInArray(val) {
				for(var i = 0; i < numbers.length; i++) {
					if(numbers[i] == val) {
						return true;
					}
				}
				return false;
			}

			function randomize(min, max) {
				do {
					rndm = Math.floor(Math.random() * (max - min + 1)) + min;
				} while(isInArray(rndm) == true);

				numbers.push(rndm);
				return rndm;
			}
		</script>
    </body>
</html>

 

komentarz zamknięcia: Problem rozwiązany.
1
komentarz 26 czerwca 2018 przez Wiciorny Ekspert (281,390 p.)
Tak na wstępie :
let t1= new Array(2); // jako rozmiar  
albo 
let t2= new Array("1","2");



(function () {
  var letter = 'A';
  
  if (letter.length) {
    console.log(letter); // zwraca A
    var letter = 'B';
    console.log(letter); // zwraca B
  }
  
  console.log(letter); // zwraca B
})();

Zmienne o zasięgu blokowym i funkcyjnym poczytaj SPECYFIKACJE 

https://blog.piotrnalepa.pl/2014/03/16/js-ecmascript-6-jaka-jest-roznica-miedzy-var-i-let/

1
komentarz 26 czerwca 2018 przez bk20 Użytkownik (740 p.)
edycja 26 czerwca 2018 przez bk20

Dzięki za odpowiedź, ale zmiana z let na var niestety nie eliminuje błędu. Może czegoś nie zrozumiałem, jeżeli tak, to prosiłbym o odpowiedź

#edit

Dodatkowo przesunąłem tego for'a na dół skryptu. To chyba mogła być przyczyna tego błędu. Mogła - bo strona nigdzie nie chce się załadować surprise

1
komentarz 26 czerwca 2018 przez Wiciorny Ekspert (281,390 p.)
for(var i = 0; i < 30; i++) {
                document.write(randomize(1, 20) + ', ');
            }
 

tutaj jest błąd dlaczego? odwołujesz się do funkcji randomize ... dopiero potem gdzies masz zmienne :)

jak usuniesz tego LOOP'A kod nie wyświetli Ci błędów.  Mówiłem, że problem leży w zasięgu zmiennych 

Druga sprawa jest taka, że zastosowanie tego powoduje- pętle nieskończoną stąd będzie błąd jak przesuniesz to np pod deklaracje zmiennych, przemyśl raz jeszcze kod. 

komentarz 26 czerwca 2018 przez bk20 Użytkownik (740 p.)
Super. Bardzo dziękuję. Zrozumiałem błąd z loopem po kilkunastu minutach, ale już wszystko działa. :)

Podobne pytania

0 głosów
2 odpowiedzi 181 wizyt
pytanie zadane 11 września 2022 w PHP przez mn130496 Gaduła (3,530 p.)
0 głosów
1 odpowiedź 199 wizyt
0 głosów
0 odpowiedzi 169 wizyt

93,454 zapytań

142,449 odpowiedzi

322,718 komentarzy

62,833 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

Kursy INF.02 i INF.03
...