Javascript Chrome控制台中ES6解构的奇怪行为 环境
谷歌Chrome:61.0.3163.79测试版(64位)(队列:测试版) JavaScript引擎:V8 6.1.534.32 代码 在Chrome中,打开一个新选项卡,在控制台中逐个键入以下代码:Javascript Chrome控制台中ES6解构的奇怪行为 环境,javascript,google-chrome,ecmascript-6,destructuring,Javascript,Google Chrome,Ecmascript 6,Destructuring,谷歌Chrome:61.0.3163.79测试版(64位)(队列:测试版) JavaScript引擎:V8 6.1.534.32 代码 在Chrome中,打开一个新选项卡,在控制台中逐个键入以下代码: let [a = b, b = 1] = []; typeof a; let a = 'other value'; a = 'other value'; 输出为: 问题: 有人能解释为什么第一条语句让[a=b,b=1]=[]将变量a设为“a未定义”并且“标识符”a已同时声明“ 第一条语句
let [a = b, b = 1] = [];
typeof a;
let a = 'other value';
a = 'other value';
输出为:
问题:
有人能解释为什么第一条语句让[a=b,b=1]=[]
将变量a
设为“a未定义”并且“标识符”a已同时声明“
第一条语句执行的魔力是什么
它与ES6有关吗
更新
示例代码无效,我只想知道输出的原因。:) 在声明b之前,您正试图将b分配给a 使用
它之所以说
a
已经声明,是因为它首先声明a
,然后它尝试将b
分配给它(尚未声明),然后是代码错误,但是a
已经声明了是的,这与时间死区有关-实际上是两次
第一期
在初始化a
之前,您试图将b
用作a的默认值。评估从左到右进行,同时按顺序初始化。使用让[a=1,b=a]=[]
起作用
第二期
在声明变量和初始化变量之间的全局范围中引发了一个错误。您可以将测试用例简化为
let a = (_ => { throw; })();
这确实声明了变量a
,但从未初始化它,因为之前发生过异常。通常-在本地作用域中-这不是问题,因为在这里声明a
的作用域没有异常。它在全局范围内是不同的-变量永远保持声明状态,但未初始化。它在永恒中死去(时区是“永远”)。请参阅。这是有效的语法吗?你并不是在破坏任何东西。例如,[a,b]=[1,2]
会破坏fineHi@VamshiGudipati的结构,是的,代码确实无效,我正在询问输出的原因。
let a = (_ => { throw; })();