我不明白为什么函数调用中的解构逻辑实际上是在声明一个新变量。
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);
我对以前的逻辑不了解。
答案 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"
模式可以防止这种情况。