Как именно работают деструктурирующие назначения в аргументах функции? - PullRequest
2 голосов
/ 22 апреля 2019

Я не понимаю, почему логика деструктурирования в вызове функции фактически объявляет новую переменную.

function fn() {}
let object = {x: "Ele", y: "From", z: "Stack"};

fn({x} = object);

console.log(x);

А во-вторых, в чем проблема в логике ниже.Я получаю Uncaught ReferenceError: x is not defined.Тем не менее, когда я использую var работает нормально.

function fn() {}
let object = {x: "Ele", y: "From", z: "Stack"};

fn({x} = object);

let x = "Dummy";
console.log(x);

У меня недостаточно знаний по предыдущей логике.

Ответы [ 2 ]

6 голосов
/ 22 апреля 2019

... фактически объявляет новую переменную

Это то, что я называю Ужас неявных глобалов . Эта строка:

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;
2 голосов
/ 22 апреля 2019

Чтобы ответить на второй вопрос первым: вы не можете использовать переменную, объявленную с let (x в данном случае) до того, как она была объявлена.При выполнении { x } = вы выполняете деструктуру до x.

Теперь, когда вы делаете fn({ x } = object), это в основном вызов функции с первым аргументом, являющимся выражением присваивания, который всегда оценивается как результатПравая сторона.a=b оценивается как b, {x} = object оценивается как object.

Я не понимаю, почему логика деструктурирования в вызове функции фактически объявляет новую переменную.

Любое присвоение идентификатору, который еще не был объявлен, неявно создает глобальную переменную."use strict" режим, чтобы предотвратить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...