Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Миллион нубских вопросов от новичка (https://javascript.ru/forum/misc/77076-million-nubskikh-voprosov-ot-novichka.html)

MarkSM 22.03.2019 03:15

Миллион нубских вопросов от новичка
 
И так уже в который раз пытаюсь выучить JS никак не получаеться и не хватает силы воли. В этот раз надеюсь смогу добиться успеха.

В этой теме хотел бы задавать просто все вопросы которые меня мучают и какими бы они тупыми не казались хотелось бы увидеть на них ответы)


Почему в данных двух функциях, есть доступ к переменной let array из function sum если как я читал в книге особенностью переменных let как раз является их действенность только внутри скобок которых она находиться, в моей случае внутри function range.

function range (start, end) {
let array = [];
for (var i = 1; i <= 10; i++) {
array.push(i);
}

return array;
}

function sum(array) {
let total = 0;
for (let value of array) {
total += value;
}

return total;
}

laimas 22.03.2019 03:21

Цитата:

Сообщение от MarkSM
есть доступ к переменной let array из function sum

Нет такого доступа.

MarkSM 22.03.2019 03:23

Спасибо за ответ! Но для понимания я бы хотел услышать уточнение разве из function sum не происходит обращение к этой переменной?

laimas 22.03.2019 03:31

Цитата:

Сообщение от MarkSM
разве из function sum не происходит обращение к этой переменной

Где вы это видите? Потому что это же имя? Ну так в функции sum это аргумент функции, а не то что в какой-то иной было объявлено. С таким же успехом аргумент можно было бы обозвать как "asdf", какая разница, вот только по смыслу такое имя не годится.

var a = range (0, 10); //чему будет равна a и является ли она непосредственно переменной array функции?
a = sum(a); //чему будет равна a?

MarkSM 22.03.2019 03:41

[quote=laimas;505145]Где вы это видите? Потому что это же имя? Ну так в функции sum это аргумент функции, а не то что в какой-то иной было объявлено. С таким же успехом аргумент можно было бы обозвать как "asdf", какая разница, вот только по смыслу такое имя не годится.

Спасибо теперь я понял что это лишь имя аргумента!:agree:

рони 22.03.2019 08:19

MarkSM,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

Malleys 22.03.2019 11:02

Тоже самое можно написать так, и тогда такого вопроса не возникает!

function* range(start, end) {
	for (let i = start; i <= end; i++)
		yield i;
}

function sum(array) {
	let total = 0;
	for(const value of array)
		total += value;

	return total;
}

// range(0, 10) |> sum |> alert;
alert(sum(range(0, 10)));

Nexus 22.03.2019 13:17

Malleys, в чем преимущество генератора над обычным массивом в коде из поста №7?

Malleys 22.03.2019 13:34

Код в первом посте range(0, 10) создаёт массив чисел, а затем, при суммировании, на нём (на массиве) запускается итератор массива.

В №7 range(0, 10) создаёт итератор, который запускается при суммировании.

Ещё пример, добавлю функцию
function* take(n, xs) {
	for(const x of xs) {
		if(n-- <= 0)
			break;

		yield x;
	}
}


Теперь, если использовать определения из №1, то alert(sum(take(5, range(1, Infinity)))); никогда ничего не вернёт, поскольку сначала попытается создать массив из всех натуральных чисел! (я в курсе про Number.MAX_SAFE_INTEGER)

Теперь, если использовать определения из №7, то alert(sum(take(5, range(1, Infinity)))); результат будет, поскольку оно просуммирует столько чисел, сколько указано!

Nexus 22.03.2019 13:54

Malleys, я знаю, как ведут себя генераторы.
Интересовало почему вы в 7-м посте генератор использовали, результат-то, по сути, один и тот же.
Без генератора скрипт будет пытаться создать массив бесконечной длины, с генератором будет суммировать числа до бесконечности.


Часовой пояс GMT +3, время: 12:42.