Миллион нубских вопросов от новичка
И так уже в который раз пытаюсь выучить 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-м посте генератор использовали, результат-то, по сути, один и тот же. Без генератора скрипт будет пытаться создать массив бесконечной длины, с генератором будет суммировать числа до бесконечности. |
Зачем в данном случае нужен метод Math.floor, если убрав его ничего не меняется. Буду благодарен за ответ , для моего понимания...
function reverseArrayInPlace(array) { for (var i = 0; i < Math.floor(array.length - 1 - i); i++) { let old = array[i]; array[i] = array[array.length - 1 - i]; array[array.length - 1 - i] = old; } return array; } let arrayValue = [1, 2, 3, 4, 5, 6]; reverseArrayInPlace(arrayValue); console.log(arrayValue); // → [6, 5, 4, 3, 2, 1] |
В данном случае Math.floor не нужен
function reverse(array) { var j = array.length - 1; for (var i = 0; i < j; i++, j--) { [array[i], array[j]] = [array[j], array[i]]; } return array; } |
Цитата:
|
Цитата:
//Attention: infinity loop 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; } sum(range(0, Infinity)); |
ОК, я такого, что вы тут написали даже и не запускал! В №9 чуть другой пример!
Вычисление range(1, Infinity) |> take.bind(null, 5) |> sum |> alert без итератора (Осторожность! Бесконечный цикл!) function range(start, end) { let array = []; for (var i = start; i <= end; i++) array.push(i); return array; } function sum(array) { let total = 0; for(const value of array) total += value; return total; } function* take(n, xs) { for(const x of xs) { if(n-- <= 0) break; yield x; } } alert(sum(take(5, range(1, Infinity)))); Вычисление range(1, Infinity) |> take.bind(null, 5) |> sum |> alert с итератором (Запускайте смело!) 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; } function* take(n, xs) { for(const x of xs) { if(n-- <= 0) break; yield x; } } alert(sum(take(5, range(1, Infinity)))); |
Цитата:
Меня изначально интересовало почему вы в коде из поста №7 использовали генератор, причина этого. Может я чего-то не знаю. Видимо причины особой использовать генератор не было. Не буду вас больше мучить вопросами, спасибо. |
Цитата:
![]() Вычисление range(1, Infinity) |> sum |> alert без итератора function range(start, end) { let array = []; for (var i = start; i <= end; i++) array.push(i); return array; } function sum(array) { let total = 0; for(const value of array) total += value; return total; } debugger; alert(sum(range(1, 5))); Вычисление range(1, Infinity) |> sum |> alert с итератором 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; } debugger; alert(sum(range(1, 5))); |
Цитата:
|
Цитата:
Непонятно, чем хуже вариант, в котором сначала создается массив значений, а после его значения суммируются. |
Цитата:
|
Цитата:
|
Malleys, спасибо.
|
laimas, задача, в которой требуется создать огромный массив по определенному правилу и дальше произвести над ним какие-то манипуляции, имхо, очень специфична.
Если и нужно будет работать с таким массивом, то он, скорее всего, уже будет создан, уже находится в памяти. Однако спасибо. |
Цитата:
Nexus, вы же и РНР знаете, и если в JS генераторы в общем то, можно сказать, это новинка, то в РНР эта штуковина существует с версии 5.5, а это десяток лет. Тоже самое что и в JS по сути, только без всякого тумана со звездочками. :) |
laimas,
Цитата:
Было интересно почему Malleys решил использовать генератор. Так как он обладает куда бОльшими знаниями, нежели я, решил узнать причину использования генератора. Может быть открыл бы для себя что новое) |
J0hnik
Попробовал запустисть ваш код, ответ не выводиться в обратном порядке. Я что-то делаю не так? Или ошибка в коде? function reverseArrayInPlace2(array) { var j = array.length - 1; for (var i = 0; i < j; i++, j--) { [array[i], array[j]] = [array[j], array[i]]; } return array; } reverseArrayInPlace2(arrayValue); let arrayValue = [1, 2, 3, 4, 5, 6]; console.log(arrayValue); |
MarkSM,
Пожалуйста, отформатируйте свой код! Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [html run] ... минимальный код страницы с вашей проблемой [/html] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Цитата:
|
Часовой пояс GMT +3, время: 06:51. |