... фактически объявляет новую переменную
Это то, что я называю Ужас неявных глобалов . Эта строка:
fn({x} = object);
эффективно:
({x} = object);
fn(object); // a bit of hand-waving here, but roughly speaking...
Поскольку он присваивается необъявленной переменной, он создает глобальную переменную. Если бы вы использовали строгий режим, вы бы получили ReferenceError вместо:
"use strict";
function fn() {}
let object = {x: "Ele", y: "From", z: "Stack"};
fn({x} = object);
console.log(x);
Результатом присваивания является присваиваемое значение. В случае назначения деструктурирования назначаемое значение является деструктурируемой вещью (значение object
, в вашем случае).
... во-вторых, в чем проблема в логике ниже. Я получаю Uncaught ReferenceError: x is not defined
Проблема при добавлении let x
заключается в том, что строка, присваивающая x
, теперь находится во временной мертвой зоне для объявления x
. x
зарезервировано в этой точке, но не инициализировано. Сообщение об ошибке говорит «не определено», потому что строка let x
еще не выполнена. Как будто у вас было:
x = 0;
let x;