Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 3
Регистрация: 30.05.2016
Сообщений: 171
1

Область видимости. Не могу вызвать переменную вне цикла For, т.е. вывести в цикле могу, а вне цикла нет. Почему?

27.07.2018, 22:40. Показов 2762. Ответов 16
Метки нет (Все метки)

Привет, не могу вызвать переменную вне цикла for, тоесть вывести в цикле могу, а вне цикла нет почему?
переменная a1 выводится как надо, а а2 віводится только в цикле - почему???
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 <script>
 var a1 = [];
 var a2 = [];
 var a = 0;
 
function factorial(n) {
  return (n != 1) ? n * factorial(n - 1) : 1;
}
 
 for(i=1; i <= 15; i++){
 a1.push(i);
}
alert(a1);
 
for(i=1; i <= 15; i++){
 a = factorial(a1[i]);
a2.push(a);
}
alert(a2); // не выводит!!!!
 </script>
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2018, 22:40
Ответы с готовыми решениями:

Как сделать переменную, инициализированную в цикле for, досупную вне этого цикла?
Здравствуйте. Подскажите как сделать чтобы переменная которая была инициализированна в цикле for...

Значения переменных, задаваемые в цикле, не читаются вне цикла
итак,суть проблемы. есть несколько вложенных циклов for, в которых в качестве счетчиков...

В каком месте использовать конструктор - вне цикла или в цикле?
Добрый день! Как писать правильнее? Ниже два примера: QStringList data; foreach(const QString...

Не могу вывести переменную из цикла
Люди, помогите чайнику, плз! Никак не могу вывести переменную из цикла для ее дальнейшего...

16
1423 / 956 / 505
Регистрация: 23.08.2015
Сообщений: 2,476
27.07.2018, 23:11 2
Спрашыватель, Запомните, у нормальных людей отсчет начинается с 0
Дело не в области видимости, у вас бесконечная рекурсия.
Это из-за того, что в какой-то момент в функцию попадает undefined, а если быть точнее, то в массиве 15 элементов, и отсчет индексов ведется с 0. А вы в цикле считаете от 1. Вот и на последнем элементе в функцию приходит undefined. Лучше ставить условия типа (n>1)? чтоб исключить бесконечных циклов, рекурсий, мало ли что передадут в функцию.

Добавлено через 3 минуты
Спрашыватель, Первым делом смотрите в консоль на наличие ошибок, и туда переменные выводите. Забудьте про alert, пользуйтесь console.log();
1
Эксперт HTML/CSS
1483 / 1231 / 517
Регистрация: 07.08.2016
Сообщений: 3,188
27.07.2018, 23:39 3
Потому что цикл у вас вылетает с переполнением стека вызовов, соответственно код дальше не выполняется и до алерта дело не доходит

Добавлено через 37 секунд
sad67man, цикл вылетает на 13 элементе, и рекурсия не бесконечная

Добавлено через 3 минуты
Кстати вообще непонятно зачем здесь сделан первый цикл, если в функцию факториала можно отправлять значения переменной i из второго?

Добавлено через 13 минут
ps. Оказывается это у меня браузер был чем то занят и переполнение происходило в данный конкретный момент времени (хотя если это случилось у меня,то может произойти и где то еще).
А так да, sad67man, прав цикл вылетал из-за неопределенного элемента массива
1
1423 / 956 / 505
Регистрация: 23.08.2015
Сообщений: 2,476
27.07.2018, 23:40 4
AlexZaw, Нет, как раз на последнем элементе (рис 1). Это я тут условие подправил, а так он жаловался на бесконечную рекурсию (рис 2.) Ну это и очевидно, ведь undefined не равно 1. Условие всегда будет выполняться.
Миниатюры
Область видимости. Не могу вызвать переменную вне цикла For, т.е. вывести в цикле могу, а вне цикла нет. Почему?   Область видимости. Не могу вызвать переменную вне цикла For, т.е. вывести в цикле могу, а вне цикла нет. Почему?  
1
AlexZaw
27.07.2018, 23:50
  #5

Не по теме:

Цитата Сообщение от sad67man Посмотреть сообщение
Условие всегда будет выполняться
Я уже поправился с ответом :)

0
1423 / 956 / 505
Регистрация: 23.08.2015
Сообщений: 2,476
27.07.2018, 23:54 6
AlexZaw,

Не по теме:

Да пока скриншоты делал.. вижу что уже поправились. Но пусть автор увидит все могущество консоли)

1
AlexZaw
28.07.2018, 00:03
  #7

Не по теме:

Цитата Сообщение от sad67man Посмотреть сообщение
Но пусть автор увидит все могущество консоли)
Это да, это полезно :)
У меня бедный хром подвис даже пока все NaN-ы считал :)
Мне вот только непонятно, насчитал он почти 13к NaN, потом стек переполнился, а откуда он еще 68 штук взял? :)

0
0 / 0 / 3
Регистрация: 30.05.2016
Сообщений: 171
28.07.2018, 09:18  [ТС] 8
Спасибо всем, остался баг, мне возращает лишние единицы, чтобы написать в ретурн что бы массив не захламлять лишними единицами?

Javascript
1
2
3
4
function factorial(n) {
  if (n == 15 || n == 0 || n == 1) return 1;
  return n * factorial(n - 1);
}
0
Эксперт HTML/CSS
1483 / 1231 / 517
Регистрация: 07.08.2016
Сообщений: 3,188
28.07.2018, 10:28 9
Цитата Сообщение от Спрашыватель Посмотреть сообщение
чтобы написать в ретурн что бы массив не захламлять лишними единицами?
Эта функция тут ни при чем, в первом варианте она была правильной. Ну единственное, что можно проверять на undefined.
Ошибка у вас в циклах. Скорее всего вы неправильно задаете диапазон. Покажите весь код.
0
0 / 0 / 3
Регистрация: 30.05.2016
Сообщений: 171
28.07.2018, 18:46  [ТС] 10
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 <script>
 var a1 = [];
 var a2 = [];
 var a = 0;
 
function factorial(n) {
  if (n == 15 || n == 0 || n == 1) return 1;
  return n * factorial(n - 1);
}
 
 for(i=0; i <= 15; i++){
 a1.push(i);
}
document.write(a1 + ' - первый массив<br>');
 
for(i=0; i <= 15; i++){
 a = factorial(a1[i]);
a2.push(a);
}
document.write(a2 + ' - второй массив<br>');
/*var MyObject = {
    
  number: a1[2],
  
  Factorial: a2[1],
 
  IsOdd : function(n) {
    return (n % 2 !== 0) ? true : false;
  }
};
*/
 
 </script>
Добавлено через 7 минут
ещё нужно последние - создать массив третий из обьектов MyObject, заполненный из первых двух массивов
0
Эксперт HTML/CSS
1483 / 1231 / 517
Регистрация: 07.08.2016
Сообщений: 3,188
28.07.2018, 21:09 11
Замените фунцию факториала на:
Javascript
1
2
3
4
function factorial(n) {
  if(n !== undefined){
  return (n >= 1) ? n * factorial(n - 1) : 1;}
}
(Проверка на undefined на всякий случай,хотя при нормальном коде он там не может появиться)
Вы уверены что первый массив должен начинаться с ноля?
Про заполнение третьего массива, это опечатка number: a1[2], Factorial: a2[1] или я не понял логики заполнения?
0
0 / 0 / 3
Регистрация: 30.05.2016
Сообщений: 171
29.07.2018, 12:02  [ТС] 12
Осталось по третьему массиву - выводит [object Object] уже 3 часа ковыряюсь... над создать массив третий из обьектов MyObject, заполненный из первых двух массивов
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 <script>
 var a1 = []; //заполнить его ПРОСТЫМИ ЧИСЛАМИ проходя от нуля до 15
 var a2 = []; // заполнить значениями беря факториалы с первого массива
 var a3 = []; // заполнить двумя массивами 
 var a = 0;
 
function factorial(n) {
  if(n !== undefined){
  return (n >= 1) ? n * factorial(n - 1) : 1;}
}
 
 for(i=0; i <= 15; i++){
 a1.push(i);
}
document.write(a1 + ' - первый массив<br>');
 
for(i=0; i <= 15; i++){
 a = factorial(a1[i]);
a2.push(a);
}
document.write(a2 + ' - второй массив<br>');
 
function MyObject(number, factorial){
    this.number = number;
    this.factorial = factorial;
 
 
 
  /*IsOdd : function(n) {
    return (n % 2 !== 0) ? true : false;
  }*/
};
 
for(var i=0; i < 30; i++){
    a3[i] = new MyObject(a1[i],a2[i]);
    document.write(a3[i]);
}
 
 </script>
0
Эксперт HTML/CSS
1483 / 1231 / 517
Регистрация: 07.08.2016
Сообщений: 3,188
29.07.2018, 12:40 13
Третий массив создается нормально, в чем вы можете убедиться обратившись к любому его элементу. ВОт только непонятно зачем вы создаете 30 элементов массива? И вообще вы всегда собираетесь использовать точные значения в циклах? Если допустим вам нужно будет в первом массиве не 15, а 10 элементов, вы будете переписывать весь код который зависит от этого массива? Почитайте про свойство массива length.

Теперь про [object Object]. Метод document.write вставляет любой текст на страницу в виде строки,как есть, а стандартным строковым представлением пользовательского объекта является строка "[object Object]".
Поэтому нужно либо вставлять объект в документ другим способом, либо использовать строковое преобразование.
https://learn.javascript.ru/object-conversion
1
0 / 0 / 3
Регистрация: 30.05.2016
Сообщений: 171
29.07.2018, 12:52  [ТС] 14
В тестовом указано в первом массиве 15 элементов, столько же во втором, а в третьем массиве мне надо 30 элементов - тоесть надо обьединить 1 и 2-ой массивы, я думал length добавить, но мне ведь надо 30 прохождений, а в любом пока существующем массиве только 15, честно говоря я уже запутался что мне делать...
0
Эксперт HTML/CSS
1483 / 1231 / 517
Регистрация: 07.08.2016
Сообщений: 3,188
29.07.2018, 13:06 15
Только у вас получается в первом и втором массиве по 16 элементов, а в третьем 31.
Причем первыми 16 элементами в третьем массиве являются объекты у которых в ключах number и factorial лежат соответствующие значения, а в оставшихся 15 элементах в ключах объектов лежит undefined.
Цитата Сообщение от Спрашыватель Посмотреть сообщение
в третьем массиве мне надо 30 элементов
Кто вам сказал?
Вам ведь нужно создать массив объектов в одном ключе которого находилось бы число, а в другом его факториал.
1
0 / 0 / 3
Регистрация: 30.05.2016
Сообщений: 171
29.07.2018, 13:20  [ТС] 16
Вам ведь нужно создать массив объектов в одном ключе которого находилось бы число, а в другом его факториал.

Как например так сделать???
Код сейчас такой
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 var a1 = []; //аполнить его ПРОСТЫМИ ЧИСЛАМИ проходя от нуля до 15
 var a2 = []; //Затем создать массив2 и заполнить значениями беря факториалы с первого массива
 var a3 = [];
 var a = 0;
 
function factorial(n) {
  if(n !== undefined){
  return (n >= 1) ? n * factorial(n - 1) : 1;}
}
 
 for(i=0; i <= 15; i++){
 a1.push(i);
}
document.write(a1 + ' - первый массив<br>');
 
for(i=0; i <= a1.length; i++){
 a = factorial(a1[i]);
a2.push(a);
}
document.write(a2 + ' - второй массив<br>');
 
function MyObject(number, factorial){
    this.number = number;
    this.factorial = factorial;
 
  /*IsOdd : function(n) {
    return (n % 2 !== 0) ? true : false;
  }*/
};
 
for(var i=0; i < a1.length; i++){
    a3[i] = new MyObject(a1[i],a2[i]);
    document.write(a3[i].number = a3[i].factorial);
    
};
0
Эксперт HTML/CSS
1483 / 1231 / 517
Регистрация: 07.08.2016
Сообщений: 3,188
29.07.2018, 14:16 17
Лучший ответ Сообщение было отмечено Спрашыватель как решение

Решение

Уже лучше, только во втором массиве 17 элементов. Индекс последнего элемента массива равен длине массива минус 1.
Потому во втором цикле нужно выполнять проверку на i < a1.length, а не i <= a1.length.
Ну и третий цикл переделать как то так:
Javascript
1
2
3
4
for(var i=0; i < a1.length; i++){
    a3[i] = new MyObject(a1[i],a2[i]);
    document.write(a3[i].number + '! = ' + a3[i].factorial + ', ');  
};
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2018, 14:16

Как записать Имена Листов в массив, а потом вне цикла вывести весь массив.
Здравствуйте, очень надеюсь на вашу помощь, не получается в цикле произвести запись Имени Листа в...

Вывод результата вне цикла
Написать программу, вычисляющую НОД (наибольший общий делитель) двух целых чисел Все...

Использование данных из БД вне цикла
Приветствую, уважаемые программисты. Такая проблема: $result = mysql_query(&quot;SELECT * FROM...

printf не выводи данные вне цикла.
Здравствуйте! Проблема состоит в том,что если printf стоит внутри какого-нибудь цикла,то данные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.