• 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)

0 głosów
296 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 (282,580 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 (282,580 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 226 wizyt
pytanie zadane 11 września 2022 w PHP przez mn130496 Gaduła (3,570 p.)
0 głosów
1 odpowiedź 248 wizyt
0 głosów
0 odpowiedzi 197 wizyt

93,629 zapytań

142,551 odpowiedzi

323,052 komentarzy

63,134 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 1936p. - dia-Chann
  2. 1916p. - DziarnowskiJ
  3. 1886p. - Łukasz Piwowar
  4. 1868p. - CC PL
  5. 1842p. - Maurycy W
  6. 1841p. - raydeal
  7. 1840p. - Adrian Wieprzkowicz
  8. 1782p. - rucin93
  9. 1701p. - rafalszastok
  10. 1588p. - Tomasz Bielak
  11. 1521p. - Michal Drewniak
  12. 1491p. - Rafał Trójniak
  13. 1444p. - robwarsz
  14. 1257p. - ssynowiec
  15. 1208p. - Mariusz Fornal
Szczegóły i pełne wyniki

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
...