我知道我可以通过查看声明的位置来确定值是
var
const
还是let
。但是我想知道 - 主要是为了调试、开发 JS 编译器和学术兴趣 - 是否有可能在创建变量(var / const / let-ness)后找出它的不变性/范围。
即
doThing(something)
会回来
let
或同等学历。就像我们可以用
typeof
或 something.constructor.name
为构造函数确定类型。
您可以在与变量相同的函数中使用直接
let
来区分 const
和 var
与 eval
:
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
语句可能使您能够缩小声明变量的范围,因为它允许您将代理添加为环境记录,但这只能提供一些见解,并且通常是一件非常危险的事情。
我曾经这样做过,但有点老套...
我创建一个变量并尝试更改它,如果它抛出错误,那么它就是一个常量变量。
我创建一个变量并尝试在
{}
大括号上更改它,如果值不同那么它最初创建那么它是一个 var,如果不是那么它是一个 let 变量。