我知道我可以通过查看声明的位置来确定它是var
const
还是let
。但是,我想知道-主要是用于调试,开发JS编译器和学术兴趣-是否可以在创建变量后找出变量的不变性/范围(var / const / let-ness)。
即
doThing(something)
会回来
let
或同等学历。就像我们可以使用typeof
或something.constructor.name
确定构造函数的类型一样。
答案 0 :(得分:6)
在与变量相同的功能中,您可以通过直接let
与const
来区分var
和eval
与let a;
try {
eval('var a');
// it was undeclared or declared using var
} catch (error) {
// it was let/const
}
:
let
就像@JonasWilms之前写的那样,您可以通过尝试分配来将const
与{
let x = 5;
const original = x;
let isConst = false;
try {
x = 'anything';
x = original;
} catch (err) {
isConst = true;
}
console.log(isConst ? 'const x' : 'let x');
}
{
const x = 5;
const original = x;
let isConst = false;
try {
x = 'anything';
x = original;
} catch (err) {
isConst = true;
}
console.log(isConst ? 'const x' : 'let x');
}
进行区分:
final Runtime runtime = Runtime.getRuntime();
final long usedMemInMB=(runtime.totalMemory() - runtime.freeMemory()) / 1048576L;
final long maxHeapSizeInMB=runtime.maxMemory() / 1048576L;
final long availHeapSizeInMB = maxHeapSizeInMB - usedMemInMB;
答案 1 :(得分:2)
let和var仅与作用域有关,因此这是不可能的。因为JavaScript不会通过引用传递,所以如果将变量传递给函数,则将失去“常数”,也失去了作用域-在该函数中,变量将只是局部作用域。所以我的想法是:不可能。
答案 2 :(得分:1)
您无法以任何方式直接访问环境记录链,因此您无法确定是否声明了变量。 with
语句可能使您能够缩小声明变量的范围,因为它允许您将Proxy添加为环境记录,但这只能提供一些见识,通常这是非常危险的事情。
答案 3 :(得分:0)
我以前经常这样做,但是有点黑...
我创建了一个变量并尝试对其进行更改,如果它引发错误,则它是一个const变量。
我创建了一个变量,然后尝试在{}
花括号上对其进行更改,如果该值不同,则它最初是创建的,则为var,如果不是,则为let变量。