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

Object Storage Arubacloud
0 głosów
135 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 (270,110 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 (270,110 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 115 wizyt
pytanie zadane 11 września 2022 w PHP przez mn130496 Gaduła (3,530 p.)
0 głosów
1 odpowiedź 159 wizyt
0 głosów
0 odpowiedzi 146 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...