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

What is difference between hoisting var x = 3 and var x

考虑以下两个片段

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

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

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

我希望类型为 undefined,因为 var x; 创建了一个具有 undefined 值的变量。

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;

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

这是因为在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);

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

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

吊装规则为:

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

所以提升的顺序是

Variable declaration -> Function declaration -> Variable assignment

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

Function declarations are hoisted over variable declarations but not over variable assignments.

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

总而言之,您的函数 x 声明不能 "overwrite"(提升)您的变量赋值,但可以 "overwrite" 您的变量声明。

x returns函数的类型,因为

"In JavaScript, functions are first-class objects, because they can have properties and methods just like any other object. What distinguishes them from other objects is that functions can be called. In brief, they are Function objects."

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

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

在JavaScript中,未声明的变量在执行时被赋值为undefined,也是undefined类型。

var a;
typeof a; //"undefined"