如何解决解构赋值:相互依赖的参数顺序
我认为在检索所有参数后执行解构,但我注意到这段代码有效。
function extract(propertyName,{ [propertyName]: value }) {
console.log(propertyName,value);
}
extract('property',{ property: 'value' });
虽然这个没有。
function extract({ [propertyName]: value },propertyName) {
console.log(propertyName,value);
}
extract({ property: 'value' },'property');
这使我最初的想法无效,但我找不到任何解释确切行为的文档或规范。
解决方法
参数值按顺序确定,这非常类似于您将每个参数编写为自己的 let
声明,从接收到的实际参数中获取值。 (这不是它的实际工作方式,这只是一个类比。)
所以你的第一个例子在概念上是这样的:
// ONLY CONCEPTUAL
function extract() {
let propertyName = /*...the first actual argument...*/;
let { [propertyName]: value } = /* ...the second actual argument... */;
console.log(propertyName,value);
}
而你的第二个行为是这样的:
// ONLY CONCEPTUAL
function extract() {
let { [propertyName]: value } = /* ...the first actual argument... */;
let propertyName = /*...the second actual argument...*/;
console.log(propertyName,value);
}
...因此它尝试在初始化“变量”之前使用 propertyName
的值,从而得到一个错误。 (因为 ES2015 中添加了参数表达式,因此对它们使用 let
而不是 var
语义。)
另一种看待它的方式是,如果您将整个参数列表视为迭代器解构的内容,则其工作方式完全相同。这样想,你的第一个例子是:
// v−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−v−−−−− iterable destructuring
let [propertyName,{ [propertyName]: value }] = /* an iterable for the actual arguments */;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^−−−−−− parameter list
这在 FunctionDeclarationInstantiation 和 IteratorBindingInitialization 部分的规范中有所涉及。
请注意,这与解构没有任何关系,只是在运行功能代码时如何将参数值分配给参数。例如,如果您尝试在较早参数的默认值表达式中使用较晚的参数名称,则会出于同样的原因而失败。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。