Помогите разобраться с замыканием в js [дубликат]

211
27 февраля 2018, 07:10

На данный вопрос уже ответили:

  • Всплывают ли переменные, объявленные с помощью let и const в ES6? 1 ответ

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

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

"Uncaught ReferenceError: userName is not defined"

Answer 1

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

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

Answer 2

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

READ ALSO
Не работает accessToken instafeedjs.com

Не работает accessToken instafeedjs.com

Сделал приложение в Instagram, получил cliendIDПрошел авторизацию, получил accessToken

200
Сравнение двух файлов онлайн?

Сравнение двух файлов онлайн?

Ищу программу для вставки на свой сайт или онлайн сервис, который позволит передавать 2 текста (программно) и сравнить их различияТо есть...

157