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

Javascript 在声明ES6值之后,如何确定它是否为var/const/let?,javascript,constants,let,Javascript,Constants,Let,我知道我可以通过查看一个值的声明位置来确定它是varconst还是let。然而,我想知道——主要是为了调试、开发JS编译器和学术兴趣——是否有可能在变量(var/const/let-ness)创建之后找到它的不变性/范围 即 会回来吗 let 或同等产品。就像我们可以用typeof或something.constructor.name为构造函数确定类型一样。您不能以任何方式直接访问环境记录链,因此无法判断是否声明了变量。with语句可能使您能够缩小范围,因为声明了一个变量,因为它允许您将代理添

我知道我可以通过查看一个值的声明位置来确定它是
var
const
还是
let
。然而,我想知道——主要是为了调试、开发JS编译器和学术兴趣——是否有可能在变量(var/const/let-ness)创建之后找到它的不变性/范围

会回来吗

let

或同等产品。就像我们可以用
typeof
something.constructor.name
为构造函数确定类型一样。

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

let和var只与范围有关,因此不可能。因为JavaScript不通过引用传递,如果将变量传递给函数,则会丢失“constness”和作用域-在该函数上,变量将只是局部作用域的变量。因此,我的想法是:这是不可能的。

您可以将
let
const
var
区分开来,直接
eval
与变量的函数相同:

let a;

try {
    eval('var a');
    // it was undeclared or declared using var
} catch (error) {
    // it was let/const
}
正如@jonaswillms之前所写,您可以通过尝试赋值来区分
let
const

{
设x=5;
常量原始=x;
设isConst=false;
试一试{
x=‘任何东西’;
x=原件;
}捕捉(错误){
isConst=true;
}
log(isConst?'const x':'let x');
}
{
常数x=5;
常量原始=x;
设isConst=false;
试一试{
x=‘任何东西’;
x=原件;
}捕捉(错误){
isConst=true;
}
log(isConst?'const x':'let x');

}
我以前经常这样做,但有点不太对劲

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


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

非常好的问题,我不认为在javascript中有任何可能的方法来检查值是否是不可变的。另外,我认为javascript中没有一种方法可以直接检查它。@GrafiCodeStudio是的,这看起来像是重复的。只是出于兴趣,这个用例是什么?@lewis在问题中提到的。但他想要的是一个返回它的函数。这只适用于
“use strict”模式,除非此后发生了更改。@ricardo是的,这更不可能。有趣的是,您可以在try/catch中进一步检查它是否可写,以确定它是否为常量。@VLAZ:是的。那已经被报道过了,但是由于某种原因现在被删掉了…?奇怪,我没有看到那个版本。它不在历史记录中,所以它可能在宽限期内(或任何所谓的宽限期内)。@ry-nevermind,我没有解释我得到的错误(我在const声明中缺少了一个初始值设定项,没有仔细查看错误消息)包装代码部分的
{}
是什么?
let a;

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