问题描述
有人在 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
即使在严格模式下,函数的声明似乎也允许使用没有前面的 var 或 let 的标识符。
获取记录器代码,并按照提升模型将嵌套函数和 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 起吊。