Миллион нубских вопросов от новичка
И так уже в который раз пытаюсь выучить 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; } |
Цитата:
|
Спасибо за ответ! Но для понимания я бы хотел услышать уточнение разве из function sum не происходит обращение к этой переменной?
|
Цитата:
var a = range (0, 10); //чему будет равна a и является ли она непосредственно переменной array функции? a = sum(a); //чему будет равна a? |
[quote=laimas;505145]Где вы это видите? Потому что это же имя? Ну так в функции sum это аргумент функции, а не то что в какой-то иной было объявлено. С таким же успехом аргумент можно было бы обозвать как "asdf", какая разница, вот только по смыслу такое имя не годится.
Спасибо теперь я понял что это лишь имя аргумента!:agree: |
MarkSM,
Пожалуйста, отформатируйте свой код! Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [html run] ... минимальный код страницы с вашей проблемой [/html] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Тоже самое можно написать так, и тогда такого вопроса не возникает!
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))); |
Malleys, в чем преимущество генератора над обычным массивом в коде из поста №7?
|
Код в первом посте 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)))); результат будет, поскольку оно просуммирует столько чисел, сколько указано! |
Malleys, я знаю, как ведут себя генераторы.
Интересовало почему вы в 7-м посте генератор использовали, результат-то, по сути, один и тот же. Без генератора скрипт будет пытаться создать массив бесконечной длины, с генератором будет суммировать числа до бесконечности. |
Часовой пояс GMT +3, время: 12:42. |