Это потому, что вы на самом деле говорите:
c = 10;
b = c;
let a = b;
А не то, что вы думаете, что говорите, а именно:
let a = 10;
let b = 10;
let c = 10;
Вы заметите, что независимо от того, сколько переменные, которые вы добавляете в свою цепочку, это будет только первая (а), которая вызывает ошибку.
Это потому, что «let» определяет вашу переменную в блоке (или «локально», более или менее означая «в скобках»), в котором вы ее объявляете.
Если вы объявляете переменную без «let», она охватывает область глобально.
Итак, в функции, в которой вы устанавливаете переменные, все получает значение 10 (вы можете увидеть это в отладчике, если вы установите точку останова). Если вы поместите консольный журнал для a, b, c в этой первой функции, все будет хорошо.
Но как только вы покидаете эту функцию, первая (а) - и снова, имейте в виду, технически в порядке назначения, это последняя - «исчезает» (опять же, Вы можете увидеть это в отладчике, если вы установили точку останова во второй функции), но две другие (или сколько бы вы ни добавили) все еще доступны.
Это потому, что «let» ТОЛЬКО ПРИМЕНЯЕТСЯ ( так что только локально ограничивает) ПЕРВАЯ ПЕРЕМЕННАЯ - опять же, которая технически является последней, которая будет объявлена и которой присвоено значение - в цепочке. У остальных технически нет «пускай» перед ними. Так что они технически объявлены глобально (то есть в глобальном объекте), поэтому они появляются в вашей второй функции.
Попробуйте: удалите ключевое слово let. Все ваши варианты теперь будут доступны.
«var» имеет аналогичный эффект локальной области видимости, но отличается тем, как переменная «поднимается», что вам определенно нужно понять, но которое напрямую не связано с вашим вопросом.
(Кстати, этот вопрос может поставить в тупик достаточно JS разработчиков, чтобы сделать его хорошим).
Настоятельно советуем вам потратить время на различия в том, как переменные могут быть объявлены в JS: без ключевого слова, с «let» и с «var».