微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

有人在 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 起吊。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。