为什么错误的“ let / const”声明会在REPL中创建不可访问的变量?

时间:2019-12-17 10:59:31

标签: javascript node.js const read-eval-print-loop let

在Node.js REPL中进行编码时,我不小心使用了symbol关键字声明了一个新的new,并且由于Symbol()不是构造函数,如本摘要所示,我遇到了一个错误,

let sym = new Symbol("some description");
// TypeError: Symbol is not a constructor
//     at new Symbol (<anonymous>)

所以我认为这很好,我会以正确的方式进行操作,但是又出现了另一个错误。

let sym = Symbol("some description");
// SyntaxError: Identifier 'sym' has already been declared

这对我来说很奇怪,因为我期望自从声明导致错误以来,该变量根本没有定义,但是现在我似乎已经定义了它。我的下一个猜测是,它可能有一个undefined值,所以我尝试到达此变量并查看其拥有什么值。

console.log(sym);
// ReferenceError: sym is not defined

什么?那么变量sym是否已定义和未定义?

我什至尝试使用对象的块作用域,以便可以使用Object.prototype.hasOwnProperty()函数检查变量是否确实存在于对象中,但不幸的是,出现了相同的问题,整个对象变得不确定,并且无法访问。

let obj = {
  a: 4,
  b: new Symbol("some description"),
};
// TypeError

console.log(obj);
// ReferenceError

let obj = {};
// Syntax Error

我发现,如果我使用var声明,这个问题可能会消失,因此我认为它与我不知道的块作用域有关。

关于这个问题,我有3个问题:

  1. 变量sym在哪里定义,未定义在哪里?这个案子与“临时死区”的想法有什么联系?

  2. sym拥有什么价值?

  3. 如何为sym变量分配新值?

  4. 此问题是特定于此情况的,还是任何错误的let / const声明都会导致相同的问题?

0 个答案:

没有答案