есть функция:
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, потому что переменная находится во "временной мертвой зоне" с начала блока и до момента ее объявления.
Комментариев нет:
Отправить комментарий