Ecmascript 6 接受解构对象作为arrow函数的唯一参数

Ecmascript 6 接受解构对象作为arrow函数的唯一参数,ecmascript-6,Ecmascript 6,我有一个函数接受回调并使用对象调用它: function login(callback) { /* do login ; */ callback({ username: 'u', email: 'e@e.e' }); } 如果我尝试: login(obj => { console.log(obj.username); }); 一切都很好,但如果我尝试: login({username, email} => { console.log(username); });

我有一个函数接受回调并使用对象调用它:

function login(callback) { 
   /* do login ; */ 
   callback({ username: 'u', email: 'e@e.e' }); 
}
如果我尝试:

login(obj => { console.log(obj.username); });
一切都很好,但如果我尝试:

login({username, email} => { console.log(username); });
我得到“VM880:2未捕获的语法错误:意外标记}(…)”


为什么这不起作用?我如何才能使它起作用?

您需要在参数周围使用括号,以便按照您期望的方式对其进行分析。如果在
=>
的左侧有一个标识符,并且没有其他标识符,则只能为箭头函数省去括号:

login(({username, email}) => { console.log(username); });

问题非常类似于

开头的大括号表示代码块的开始。但是解构对象模式
{username,email}
不是一个代码块。破坏模式周围的括号强制将其作为表达式进行计算。正如Paulpro已经提到的,解决方案是在对象模式
{username,email}
周围加上括号:

login({username,email})=>{console.log(username);})


还请参见

您需要将解构参数包装在括号中,即“login({…})=>{console.log(…)}”