函数参数中的销毁分配究竟如何工作?

时间:2019-04-22 15:51:02

标签: javascript destructuring

我不明白为什么函数调用中的解构逻辑实际上是在声明一个新变量。

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 个答案:

答案 0 :(得分:6)

  

...实际上是在声明新变量

这就是我所说的The Horror of Implicit Globals。这行:

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;

答案 1 :(得分:2)

首先要回答第二个问题:在声明之前,不能使用用let声明的变量(在这种情况下为x)。在进行{ x } =时,您确实会分解为x

现在,当您执行fn({ x } = object)时,它基本上是一个函数调用,其第一个参数是赋值表达式,并且始终求值为右手边的结果。 a=b评估为b{x} = object评估为object

  

我不明白为什么函数调用中的解构逻辑实际上是在声明一个新变量。

对尚未声明的标识符的任何赋值都会隐式创建一个全局变量。 "use strict"模式可以防止这种情况。