2

Есть код, он выводит ошибку на второй строчке, почему?

getBigName(userName);
function getBigName(name) {
 name = name + "";
 return name.toUpperCase();
}
let userName = 'Ivan';

"Uncaught ReferenceError: userName is not defined"

Kromster
  • 13,809
Matc
  • 577

2 Answers2

3

Здесь подробно описано и сказано, что сперва нужно объявить переменную, а потом в неё записывать данные..

let userName = 'Ivan';
getBigName(userName);

function getBigName(name) { name = name + ""; console.log(name); return name.toUpperCase(); }

entithat
  • 13,090
0

Ваш вопрос не в замыкании, а во всплытии (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 и всплывает, но использовать его до присвоения нельзя. Это называется временная мертвая зона. Поэтому такой код выкидывает ошибку

ThisMan
  • 12,261