函数实际上是在变量之前首先提升的吗?

问题描述

有人在 discord 上给我发了这张照片,说先提升函数,然后是变量。

prnt .sc/xdwc9a(请把点号前的空格删掉,我不想发垃圾邮件

他的说法似乎是正确的,因为调用函数时没有抛出任何错误

Kyle Simpson 在他的 YDKJS 书中也说了同样的话:

  • bit .ly/39Wolka

然而,当我尝试它时,我没有得到我所期望的。 记录器() // 10

function logger(){

var x = 10;

function x(){

console.log('Function code')

}

function x(){
  console.log("more code")
}

console.log(x)

}

这将返回 10,但是因为函数首先被提升,x 函数应该已经被提升,并且在第二次提升(提升变量)尝试提升 var x 时;它应该忽略它,因为函数 x 已经被提升了,但它似乎不是这里发生的事情!

我错过了什么吗?

解决方法

使用吊装的心理图景,我会这样想。

请注意,如果标识符 a 用于函数,则后续的重新声明 var a 没有任何区别。 a 仍然引用同一个函数。

/?utm_source=pwa

此外,如果标识符 a 用于函数,则可以重新分配该标识符以表示数字。

function a(){console.log('hello')}
console.log(typeof a);     //function
var a;
console.log(typeof a);     //function
a();                       //hello

即使在严格模式下,函数的声明似乎也允许使用没有前面的 varlet 的标识符。

获取记录器代码,并按照提升模型将嵌套函数和 var x 移至顶部

'use strict';
function a(){}
console.log(typeof a);     //function
a = 123;
console.log(typeof a);     //number

console.log(x) 行,x 是数字 10。

,

变量和函数一样首先被提升。但是当变量首先被提升时,它们的值是 undefined。另一方面,函数声明(不是表达式或 IIFE)会随着它们的内容被提升。

这里是从 MDN 起吊。