我知道我可以通过查看声明值的位置来找出值是var
const
还是let
。但是我想知道 - 主要用于调试,开发JS编译器和学术兴趣 - 是否有可能在创建变量(var/const/let-ness(后找出变量的不变性/范围。
即
doThing(something)
会回来
let
或同等学历。就像我们可以为构造函数确定具有typeof
或something.constructor.name
的类型一样。
变量相同的函数中使用直接eval
来区分let
和const
与var
:
let a;
try {
eval('var a');
// it was undeclared or declared using var
} catch (error) {
// it was let/const
}
正如@JonasWilms之前所写的,您可以通过尝试分配来区分let
和const
:
{
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 变量。