Есть код, он выводит ошибку на второй строчке, почему?
getBigName(userName);
function getBigName(name) {
name = name + "";
return name.toUpperCase();
}
let userName = 'Ivan';
"Uncaught ReferenceError: userName is not defined"
Есть код, он выводит ошибку на второй строчке, почему?
getBigName(userName);
function getBigName(name) {
name = name + "";
return name.toUpperCase();
}
let userName = 'Ivan';
"Uncaught ReferenceError: userName is not defined"
Ваш вопрос не в замыкании, а во всплытии (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 и всплывает, но использовать его до присвоения нельзя. Это называется временная мертвая зона. Поэтому такой код выкидывает ошибку
спасибовсегда приятно, но можно и ответ принять... – Air Feb 26 '18 at 09:31