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

时间:2019-05-30 10:32:00

标签: javascript const let

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

doThing(something)

会回来

let

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

4 个答案:

答案 0 :(得分:6)

在与变量相同的功能中,您可以通过直接letconst来区分varevallet 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变量。