如何在 ES2015 中将所有属性解构为当前范围/闭包?
IT技术
javascript
ecmascript-6
destructuring
ecmascript-2016
2021-01-23 13:12:03
3个回答
我认为您正在寻找with
statement,它完全符合您的要求:
const vegetableColors = {corn: 'yellow', peas: 'green'};
with (vegetableColors) {
console.log(corn);// yellow
console.log(peas);// green
}
但是,它已被弃用(在严格模式下,包括 ES6 module),这是有充分理由的。
将所有属性解构到当前作用域中
你不能在 ES6 1。这是一件好事。明确说明您要引入的变量:
const {corn, peas} = vegetableColors;
或者,您可以扩展全局对象Object.assign(global, vegetableColors)
以将它们放在全局范围内,但实际上,这比with
语句更糟糕。
1:……虽然我不知道是否有草案允许在 ES7 中允许这样的事情,但我可以告诉你,任何提案都会被 TC 否决:-)
我认为您正在寻找:
const {corn, peas} = vegetableColors;
如果Pointy 是正确的,您在不知道名称corn
和的情况下询问如何执行此操作peas
,则您不能使用解构赋值。
您只能在全局范围内使用循环,但我确定您不想在全局范围内执行此操作。不过,以防万一:
// I'm sure you don't really want this, just being thorough
Object.keys(vegetableColors).forEach((key) => {
Object.defineProperty(this, key, {
value: vegetableColors[key]
});
});
(enumerable: true
如果你希望这些伪常量是可枚举的,就扔在那里。)
这适用于全局范围,因为this
指的是全局对象。
我不推荐它,但你可以用它eval()
来完成类似的事情:
vegetableColors = {corn: 'yellow', peas: 'green'};
function test() {
for ( let i=0; i < Object.keys(vegetableColors).length; i++ ) {
let k = Object.keys(vegetableColors)[i];
eval(`var ${k} = vegetableColors['${k}']`);
}
console.log(corn); // yellow
}
test();
console.log(corn); // undefined (out of scope)