На данный вопрос уже ответили:
Есть код, он выводит ошибку на второй строчке, почему?
getBigName(userName);
function getBigName(name) {
name = name + "";
return name.toUpperCase();
}
let userName = 'Ivan';
"Uncaught ReferenceError: userName is not defined"
Здесь подробно описано и сказано, что сперва нужно объявить переменную, а потом в неё записывать данные..
let userName = 'Ivan';
getBigName(userName);
function getBigName(name) {
name = name + "";
console.log(name);
return name.toUpperCase();
}
Ваш вопрос не в замыкании, а во всплытии (hoisting)
В старой спецификации, переменные объявленные через var всплывали
console.log(foo) // undefined
var foo = 'foo'
Ошибки такой код не вызовет, потому что движок расценит его как:
var foo;
console.log(foo)
foo = 'foo'
Именованные функции по спецификации всплывают вместе с объявлением
foo() // foo
function foo() {
console.log('foo')
}
В новой спецификацииes6 добавили два новых ключевых слова let, const, они тоже всплывают, но не так как мы ожидали
console.log(foo)
let foo = 'foo'
Движок прочитает это так
let foo
console.log(foo)
foo = 'foo'
Казалось бы, тоже самое что и с var, но есть один ньюанс, хоть let и всплывает, но использовать его до присвоения нельзя. Это называется временная мертвая зона. Поэтому такой код выкидывает ошибку
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости