【问题标题】:Destructuring with undeclared variables - what is their scope?使用未声明的变量进行解构——它们的范围是什么?
【发布时间】:2019-11-14 00:38:32
【问题描述】:

如果我有这段代码(它使用解构),它似乎正在创建新变量sspp

但是这些的范围是什么?它们是作为var 还是let 变量创建的?
它们是函数作用域还是块作用域?

let config = {
    server: 'localhost',
    port: '8080',
    timeout: 900,
};
/* no let or var here */ ({server : ss, port : pp} = config); 
console.log(ss, pp);

我的问题与建议的问题不重复。我知道var,如果你忽略它会发生什么。我在这里寻找的真正答案是 Barmar 提供的答案。我只是不确定解构赋值的行为是否完全与普通赋值相同,或者在后台它假定 var(函数)或 let(块)范围。就这样。在提出另一个问题多年后,JS 中引入了解构。因此,假设解构赋值可能与通常的赋值有一些不同的语义是合乎逻辑的。正如 Barmar 所证实的,事实并非如此,所以我已经准备好了。

【问题讨论】:

标签: javascript


【解决方案1】:

它们是全局变量,就像在普通赋值中一样。您的代码只是以下的简写:

ss = config.server;
pp = config.port;

【讨论】:

    【解决方案2】:

    它们是全球性的。您甚至可以通过对示例稍作修改来证明这一点。 console.log 语句都适用于以下 sn-p。如果是块作用域,两者都会失败,第一个会通过,但如果是函数作用域,第二个会失败,但显然两者都有效。

    (function() {
      {
        let config = {
            server: 'localhost',
            port: '8080',
            timeout: 900,
        };
        ({server : ss, port : pp} = config); 
      }
    
      console.log(ss, pp);
    })();
    
    console.log(ss, pp);

    【讨论】:

      【解决方案3】:

      它们将是全局变量。任何未声明的变量赋值都是全局的。

      来源:https://www.w3schools.com/js/js_scope.asp

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-15
        • 1970-01-01
        • 2018-03-15
        • 2010-09-18
        • 1970-01-01
        • 2011-02-13
        • 1970-01-01
        相关资源
        最近更新 更多