Javascript 起重var x=3和var x之间的区别是什么

Javascript 起重var x=3和var x之间的区别是什么,javascript,function,hoisting,Javascript,Function,Hoisting,考虑以下两个片段 函数x{} var x=3; console.logtypeof x//numbervar x声明变量xbut不为其赋值 如果确实将其值设置为未定义,则该值将是未定义的: 函数x{} var x=未定义; console.logtypeof x//undefined这是因为在第一节中,您将x设置为具有number类型的新变量,换句话说,var x=3在x上被重写,并且由于3而具有number类型 但在第二节中,您只需调用x,并说它是具有函数类型的变量。这是因为在JavaSc

考虑以下两个片段

函数x{} var x=3; console.logtypeof x//numbervar x声明变量xbut不为其赋值

如果确实将其值设置为未定义,则该值将是未定义的:

函数x{} var x=未定义;
console.logtypeof x//undefined这是因为在第一节中,您将x设置为具有number类型的新变量,换句话说,var x=3在x上被重写,并且由于3而具有number类型
但在第二节中,您只需调用x,并说它是具有函数类型的变量。

这是因为在JavaScript中,如果声明了一个函数和一个具有相同名称和作用域的变量,则它们会像这样被提升:

如果变量有一个值,或在任何一点上获得一个值,它将被提升到顶部并优先。 如果变量已创建,但具有未定义的值,例如var x;,然后函数优先

当您显式地将值设置为undefined(如var x=undefined)时,不会发生这种情况

这就是为什么会发生这种情况,它在任何点都会得到一个值

函数x{} var x; x=4;
console.logtypex 未定义的变量不会覆盖现有变量

var x=111; var x; console.logtypex;
console.logx 吊装规则如下:

变量赋值优先于函数声明 函数声明优先于变量声明 所以吊装的顺序是

Variable declaration -> Function declaration -> Variable assignment
看看这个,基本上,引用这篇文章,发生这种情况的原因是:

函数声明挂起在变量声明上,而不是挂起在变量赋值上

在这方面,它甚至有与你在问题中给出的完全相同的例子


总之,函数x的声明不能覆盖变量赋值,但可以覆盖变量声明。

x返回函数类型,因为

在JavaScript中,函数是一级对象,因为它们可以像任何其他对象一样具有属性和方法。它们与其他对象的区别在于可以调用函数。简而言之,它们是函数对象

资料来源:

基本上,您已经创建了两个引用相同名称x的对象,并且因为var x没有被赋予任何类型的值,所以函数返回时优先于未赋值的变量。

在JavaScript中,未声明的变量在执行时被赋予未定义的值,并且也是未定义的类型


VarX的可能重复应该隐式地将未定义赋值赋值给x,即使没有有意赋值,问题在于函数和变量的提升顺序,而不是assignment@jackz314关键是赋值和声明变量之间的区别在声明时总是未定义的,但只有当它们具有赋值时,函数声明才会覆盖它。因为顺序是变量声明,函数声明,然后是脚本执行,脚本执行可能会执行变量赋值。我想我们在同一页上,因为我们都同意顺序是问题所在,但你的回答听起来像是赋值的问题,可能只是我。是的,赋值是问题所在。因为如果没有赋值,那么函数声明之后就什么都没有了,而当有赋值的时候,它会在之后执行。我知道,这是因为你提到的顺序,我想这只是我误解了你解析它的方式,对不起。
var a;
typeof a; //"undefined"