JavaScript中是否也支持变量初始化

JavaScript中是否也支持变量初始化,javascript,hoisting,Javascript,Hoisting,我很困惑。变量初始化是否已吊装?我认为它被挂起是因为我们在声明和初始化变量之前访问它 console.log(a); var a = 4; undefined undefined undefined表明变量a是在代码执行之前声明的,这是因为提升 如果我错了,请纠正我。这样做的方式是在整个程序中都可以访问该变量,请参见以下内容: “a”未定义,因为它未在程序中声明 但是,当我声明一个时,它现在可以在整个程序中访问。 如果我设置了a的值,这只发生在控制台日志之后,操作顺序仍然是完整的,唯一挂起

我很困惑。变量初始化是否已吊装?我认为它被挂起是因为我们在声明和初始化变量之前访问它

console.log(a);
var a = 4;
undefined
undefined
undefined表明变量a是在代码执行之前声明的,这是因为提升


如果我错了,请纠正我。

这样做的方式是在整个程序中都可以访问该变量,请参见以下内容:

“a”未定义,因为它未在程序中声明

但是,当我声明一个时,它现在可以在整个程序中访问。

如果我设置了a的值,这只发生在控制台日志之后,操作顺序仍然是完整的,唯一挂起的是声明

哈哈,我忘记了最后一个字母“a”周围的括号,不太清楚为什么quokka仍然有预期的输出,quokka为阅读我的思想赢得了胜利哈哈

在JavaScript中,变量和函数声明都被挂起

初始化不是必需的


这意味着,不管声明的词法位置如何,标识符从封闭代码区域(函数或块)的最开始就在语义上存在

这意味着标识符(即变量名)在语义上出现在声明它们的代码行之前——如果只是为了保证相同名称的标识符之间不会发生混淆的话

请注意,在对变量的声明进行评估之前,已提升的标识符可能不可供开发人员访问(例如,如果使用
let
)。即,函数或块开始执行后的一段时间。这一时期的正式名称是“暂时死区”

在JavaScript中,变量和函数声明都被挂起。

初始化不正确。

对于使用
var
声明的变量,其效果是,无论声明的词法(即在代码中)位置如何,都可以将声明想象为位于封闭函数的最顶端

对于严格模式代码(
函数
函数*
let
常量
)中的所有其他内容,其效果是可以想象声明位于封闭块的最顶端(可能是函数,也可能不是函数),而不管声明的词法位置如何

对于包含在块中的函数语句,非严格代码有一个单独的、更复杂的函数。看

对于使用
var
声明的变量,变量本身(默认值为
undefined
)可从封闭执行上下文的顶部进行赋值和解引用(读取其值)

挂起的
var
声明自动初始化为
undefined

对于其他所有内容,运行时都会从封闭块的顶部知道标识符,但在执行流移动到词法声明点之前,它不可用于赋值或取消引用。也就是说,暂时的死区已经过去了

挂起的
函数
/
函数*
声明立即用挂起的函数初始化

注意,在JavaScript中,初始化执行上下文(堆栈帧)的算法最后处理函数声明,这意味着
function
声明的提升似乎比
var
声明的提升“更高”

这意味着,如果具有相同标识符的函数声明和
var
都在同一函数中声明,则在执行封闭函数的开始时,标识符将与
函数
(而不是
var
)相关联

对于
let
const
class
,在控件移过变量的词法声明之前,不会初始化标识符

这些
let
const
class
声明类型在语言生命的后期被添加到语言中(ES 2015)

语言设计者选择这种新行为是为了使JavaScript更易于理解,并避免在词法声明点引入之前允许赋值和取消引用的微妙错误

出于这个原因,JavaScript中曾经有一个最佳实践,即变量应该在其封闭函数的最顶端声明

因此,在您的示例代码中:

1  console.log(a);
2  var a = 4;
   undefined
   undefined
在执行之前,当代码的执行上下文(或堆栈帧)被实例化时,
a
被提升到封闭范围的顶部

a
是使用
var
声明的,因此第1行允许在
console.log(a)
内取消对
a
的引用,并且
未定义的
的自动初始化值被打印到控制台

然后在第2行,代码将
4
分配给
a
(但不打印任何内容)

如果在浏览器控制台中运行,则最终语句返回的值将由浏览器自动打印


在这种情况下,
var的结果a=4
未定义的
,因此第二个
未定义的
将被打印到控制台。

欢迎使用堆栈溢出-这是从浏览器控制台发出的吗?声明被挂起;赋值发生在函数中写入赋值的行上。而且,正如@Mikkel所说的(我认为),这只在函数范围内起作用。MDN总是第一个去做这些事情的地方,这里已经解释过了。一个重复的多次。。“试图在声明的词法位置之前使用[let、const或class]标识符将抛出引用错误”-事实上,不是。Th