【问题标题】:Why declared variables in Javascript are non-configurable in the current scope?为什么 Javascript 中声明的变量在当前范围内是不可配置的?
【发布时间】:2019-01-19 07:29:09
【问题描述】:

我使用关键字 var 创建了一个变量 x,但是当我执行以下操作时:

var x = 10;
delete x;

它返回 false。基本上,我不想删除 x 变量,但我的问题是为什么 javascript 不允许配置在当前范围上下文中声明的变量。 this documentation中也提到了这一点,但问题是为什么?

【问题讨论】:

  • delete 运算符从来没有打算对作用域变量做任何事情——它只在从对象中删除属性的上下文中才有意义,这是一个完全不同的概念

标签: javascript ecmascript-6 hoisting


【解决方案1】:

因为否则每个x 可能会或可能不会抛出错误,或者可能突然引用另一个变量:

  let x = 2;
  {
     let x = 3;
     if(Math.random() > 0.5) delete x;
     console.log(x); // ?!
  }

这使得代码完全容易出错和不可预测,并且无法优化,每一行都可能突然变成语法错误,这就是为什么不能以这种方式删除变量的原因。

但是,还有另一种方法可以通过添加一个可以改变的对象作为范围来获得这种行为,这就是为什么没有人使用with 语句的原因:

  const scope = { b: 2 };
  with(scope) {
    console.log(b); // 2
    delete scope.b;
    console.log(b); // reference error
  }

【讨论】:

  • 不是正确的答案。好的,上面的答案是针对用关键字var声明的变量,好吧假设我声明没有关键字var,那么为什么它在使用中也能被删除在以后的代码中?然后呢?
  • @purpleBytes 因为window 是一个糟糕的设计决策,就像with ...
  • 没有关于 window 对象的任何内容。
  • @purpleBytes 错误。 a = 1; delete window.a; console.log(a);
  • 在全局范围内使用 var 或不使用 var 声明的变量附加到 window 对象。 window 对象没什么好说的。
【解决方案2】:

如果您在第一次使用时声明了变量(使用 var x;),则无法删除该变量。 但是,如果您的变量 x 首次出现在脚本中时没有声明,

如果你没有使用 var 关键字,你可以删除变量。

您可以从此资源获得更多信息 http://www.javascripter.net/faq/deleteavariable.htm

【讨论】:

  • 您的回答上下文与问题相同,为什么如果您在第一次使用时声明了变量(使用 var x;),您不能删除它?跨度>
猜你喜欢
  • 1970-01-01
  • 2011-02-13
  • 2018-03-15
  • 2010-11-23
  • 1970-01-01
  • 2021-02-12
  • 2022-11-30
  • 2017-12-02
  • 1970-01-01
相关资源
最近更新 更多