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为阅读我的思想赢得了胜利哈哈
这意味着,不管声明的词法位置如何,标识符从封闭代码区域(函数或块)的最开始就在语义上存在 这意味着标识符(即变量名)在语义上出现在声明它们的代码行之前——如果只是为了保证相同名称的标识符之间不会发生混淆的话 请注意,在对变量的声明进行评估之前,已提升的标识符可能不可供开发人员访问(例如,如果使用
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