提升var x = 3和var x有什么区别

时间:2019-04-22 05:24:35

标签: javascript function hoisting

考虑以下两个片段

function x(){}
var x = 3;
console.log(typeof x) //"number"

发生这种情况是因为首先悬挂了函数声明。

function x(){}
var x;
console.log(typeof x) //"function"

我希望类型为undefined,因为var x;创建的值为undefined的变量。

7 个答案:

答案 0 :(得分:0)

其原因在于,在第一部分中,您将x设置为具有数字类型的新变量,换句话说,var x = 3在x上被覆盖并且由于3而具有数字类型 但在第二部分中,您只需调用x,并说它是具有函数类型的变量。

答案 1 :(得分:0)

这是因为在JavaScript中,如果声明了具有相同名称和范围的函数和变量,它们将像这样被吊起:

如果变量具有值,或在任何时候获取值,则将其提升到顶部并优先。
如果变量已创建但具有undefined值(例如var x;),则该函数优先。

当您将值undefined明确设置为var x = undefined

时,不会不会发生

这就是为什么会发生这种情况(它在任何时候获取一个值)

function x() {}
var x;
x = 4;
console.log(typeof x);

此处相同-即使变量和函数的位置为奇数,因为变量获取值:

var x;
function x() {}
x = 5;
console.log(typeof x);

答案 2 :(得分:0)

未定义的变量不会覆盖现有变量。

var x = 111;
var x;
console.log(typeof x);
console.log(x);

答案 3 :(得分:0)

起吊的规则是:

  1. 变量赋值优先于函数声明
  2. 函数声明优先于变量声明

所以起吊顺序应该是

Variable declaration -> Function declaration -> Variable assignment

基本上,看看这篇article来引用这篇文章,发生这种情况的原因是:

  

函数声明悬挂在变量声明之上,而不悬挂在变量分配之上。

在此section中,它甚至具有与您在问题中给出的示例完全相同的示例。

总而言之,您对函数x的声明不能“覆盖”(悬停)您的变量赋值,但可以“覆盖”您的变量声明。

答案 4 :(得分:0)

x返回函数的类型,因为

“在JavaScript中,函数是一流的对象,因为它们可以像其他任何对象一样具有属性和方法。区别于其他对象的是可以调用函数。总之,它们是函数对象。” < / p>

来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions

基本上,您已经创建了两个引用相同名称var x的对象,并且由于没有为asset.requestContentEditingInput提供任何类型的值,因此会以优先于未分配变量的方式返回该函数。

答案 5 :(得分:0)

在JavaScript中,未声明的变量在执行时被分配为未定义的值,并且其类型也为未定义。

var a;
typeof a; //"undefined"

答案 6 :(得分:-1)

var x声明了变量x,但未为其分配任何内容。

如果您确实将其值设置为undefined,则该值为undefined

function x(){}
var x = undefined;
console.log(typeof x) //"undefined"

所以您在示例中所做的只是

var x;
function x(){}

在我的示例中为

var x;
function x(){}
x = undefined;