声明后,如何确定 ES6 值是否为 var / const / let



我知道我可以通过查看声明值的位置来找出值是var const还是let。但是我想知道 - 主要用于调试,开发JS编译器和学术兴趣 - 是否有可能在创建变量(var/const/let-ness(后找出变量的不变性/范围。

doThing(something)

会回来

let

或同等学历。就像我们可以为构造函数确定具有typeofsomething.constructor.name的类型一样。

您可以在与

变量相同的函数中使用直接eval来区分letconstvar

let a;
try {
    eval('var a');
    // it was undeclared or declared using var
} catch (error) {
    // it was let/const
}

正如@JonasWilms之前所写的,您可以通过尝试分配来区分letconst

{
  let x = 5;
  let isConst = false;
  
  try {
    x = x;
  } catch (err) {
    isConst = true;
  }
  
  console.log(isConst ? 'const x' : 'let x');
}
{
  const x = 5;
  let isConst = false;
  
  try {
    x = x;
  } catch (err) {
    isConst = true;
  }
  
  console.log(isConst ? 'const x' : 'let x');
}

let 和 var 只是关于范围,所以这是不可能的。因为 JavaScript 不是通过引用传递的,如果你要把一个变量传递给一个函数,你会失去"恒常性"和作用域 - 在该函数上,变量将只是一个局部作用域的变量。所以我的想法是:这是不可能的。

您不能以任何方式直接访问环境记录链,因此您无法判断是否声明了变量。with语句可能使您能够缩小范围,因为它允许您添加代理作为环境记录,但这只能提供一些见解,这通常是一件非常危险的事情。

我曾经这样做过,但它有点笨拙......

我创建一个变量并尝试更改它,如果它抛出错误,那么它是一个常量变量。

我创建一个变量并尝试在{}大括号上更改它,如果值不同,那么它是最初创建的,那么它是一个变量,如果不是,那么它是一个 let 变量。

相关内容

  • 没有找到相关文章

最新更新