Страницы

Поиск по вопросам

четверг, 20 июня 2019 г.

не могу повторно использовать переменную

есть функция:
function buildUser(first, last) { let fullName = first + " " + last; return {first, last, fullName}; }
я создаю переменные с помощью неё:
let {first, last, fullName} = buildUser("User1", "LastName");
console.log(first); console.log(last); console.log(fullName);
всё работает, но почему я не могу создать ещё одни переменные никак не пойму. делаю так:
let {first, last, fullName} = buildUser("test1", "test1");
console.log(first); console.log(last); console.log(fullName);
получаю синтаксическую ошибку:
SyntaxError: redeclaration of let first let {first, last, fullName} = buildUser("test1", "test1");
если делаю с новыми переменнымы то они получаются undefined:
let {first2, last2, fullName2} = buildUser("test1", "test1");
console.log(first2); console.log(last2); console.log(fullName2);
что я упускаю , объясните пожалуйста?
совсем запутался: такой код почему то не работает тоже:
function buildUser2 (first, last, postCount) { let fullNameMy = first + " " + last; const ACTIVE_POST_COUNT = 10;
return { firstMy, lastMy, fullNameMy, isActive(){ return postCount >= ACTIVE_POST_COUNT; } } }
let {firstMy, lastMy, fullNameMy} = buildUser2("test2", "test2");
console.log(firstMy); console.log(lastMy); console.log(fullNameMy);
ошибка:
ReferenceError: can't access lexical declaration `firstMy' before initialization


Ответ

Проблема в операторе let
Повторное объявление той же переменной в том же блоке или функции приведет к выбросу исключения SyntaxError. если делаю с новыми переменными то они получаются undefined:
let {first2, last2, fullName2} = buildUser("test1", "test1");
console.log(first2); console.log(last2); console.log(fullName2);
При реструктуризирующем присваивании важно имя полей.
В функции buildUser возвращается объект
return {first, last, fullName};
это сокращенная форма объявления свойств объекта эквивалентная
{ "first": first, "last": last, "fullName": fullName, }
В присваивании ожидается: first2, last2, fullName2 в возвращаемом объекте их нет. поэтому они принимают значение по умолчанию: undefined
Проблем с именами свойств объектов можно избежать если возвращать из функции не объект а массив
function buildUser(first, last) { let fullName = first + " " + last; return [first, last, fullName]; } let [first, last, fullName] = buildUser("User1", "LastName"); console.log(first,last,fullName); let [first2, last2, fullName2] = buildUser("test1", "test1"); console.log(first2, last2, fullName2);
Обновление:
ошибка:
ReferenceError: can't access lexical declaration `firstMy' before initialization
В стандарте ECMAScript 2015 переменные, объявленный оператором let, переносятся наверх блока. Но если вы сошлетесь в блоке на переменную, до того как она будет объявлена оператором let, то это приведет к выбросу исключения ReferenceError, потому что переменная находится во "временной мертвой зоне" с начала блока и до момента ее объявления.

Комментариев нет:

Отправить комментарий