Javascript 如何在ES2015中将所有属性分解为当前作用域/闭包? 我想这样做:

Javascript 如何在ES2015中将所有属性分解为当前作用域/闭包? 我想这样做:,javascript,ecmascript-6,destructuring,ecmascript-2016,Javascript,Ecmascript 6,Destructuring,Ecmascript 2016,我似乎找不到或想不出如何做到这一点,但我真的认为我以前在某个地方见过这样做!:P 注意:我正在使用阶段设置为0 CONTEXT:我试图让自己更干练,不要到处引用this.state或this.props。而且,如果数据发生变化,也不必不断向destructure添加属性。我想您正在寻找: const {corn, peas} = vegetableColors; 如果您询问如何在不知道名称的情况下执行此操作,corn和peas,则无法使用解构赋值 您只能在全局范围内使用循环,但我确信您不希

我似乎找不到或想不出如何做到这一点,但我真的认为我以前在某个地方见过这样做!:P

注意:我正在使用
阶段
设置为
0


CONTEXT:我试图让自己更干练,不要到处引用
this.state
this.props
。而且,如果数据发生变化,也不必不断向destructure添加属性。

我想您正在寻找:

const {corn, peas} = vegetableColors;


如果您询问如何在不知道名称的情况下执行此操作,
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
。)


这在全局范围内有效,因为此指的是全局对象。

我认为您正在寻找,它完全符合您的要求:

const vegetableColors = {corn: 'yellow', peas: 'green'};
with (vegetableColors) {
    console.log(corn);// yellow
    console.log(peas);// green
}
但是,出于充分的理由,它被弃用(在严格模式下,包括ES6模块)

将所有属性分解为当前范围

你不能在ES61中使用。明确说明要引入的变量:

const {corn, peas} = vegetableColors;
或者,您可以使用
object.assign(global,vegetableColors)
扩展全局对象,将它们放入全局范围,但实际上,这比使用
语句的
更糟糕


1:…虽然我不知道ES7中是否有允许这样做的草案,但我可以告诉您,任何提案都将被TC否决:-)

我不推荐它,但您可以使用
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)
vegetableColors={玉米:“黄色”,豌豆:“绿色”};
功能测试(){
for(设i=0;i
我认为OP所寻找的是一种将对象的属性解包成类似命名的局部变量的方法,而不需要预先知道源对象。(我无法想象这会有什么用途。)@Pointy:我为这个问题添加了一个上下文:)或者你想解包100个属性,而不必显式地命名它们,也不必在每次向对象添加新属性时更新列表。请尝试查找你以前在哪里看到过这一点,我很想读那篇文章,假设你能做到。那么,下一个说法是什么?如果您事先不知道这些变量的名称,您将如何编写使用这些变量的代码?@Pointy,关键是如果您使用的是下划线或ramda之类的实用程序库,您不必每次使用新函数(或在每次函数调用前添加
.
R.
)时都不断返回文件顶部并编辑按名称导入函数的行。@Jonah这听起来像是一种严重的代码气味。随意污染名称空间似乎会导致持续的潜在灾难。@Pointy,你是说,如果你熟悉某个实用程序库,只想使用它的函数,就不可能做到这一点吗?如果你写了图书馆怎么办?这场“潜在灾难”到底是什么?你忘了库中有一个叫做X的函数?事实上我只记得我以前的答案,也没有立即想到
这个
:-)我知道
的功能,我永远不会使用它,但这正是我想要的。。。废话!我在想什么!?:PI不同意这是一件好事。当然,这可能很危险。这也可能正是程序员想要做的。他应该能够自己做出选择。这并不是说javascript作为一种语言,对任何让你射中自己的东西都采取了强硬的设计立场。@Jonah:Strict mode是对射中自己的脚和防止优化功能的设计立场:-)如果你愿意,你仍然可以使用
,它不会从语言中消失(主要是为了向后兼容)。呃,我仍然认为这是一个有用的功能,但我可以看到争论的另一面。在任何情况下,
with
都不是一个“解决方案”在我看来,因为现在你必须用
将整个模块包装在
中,并添加一个级别缩进,这比在每个函数调用前加上对象名或者在顶部用解构按名称导入所有内容更糟糕。
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)