JavaScript 的自执行匿名函数中存在什么问题?
javascriptweb developmentobject oriented programming
假设这里有一个示例代码片段,我们需要告诉该片段可能的输出并提供解释
var name = 'Zakir'; (() => { name = 'Rahul'; return; console.log(name); function name(){ let lastName = 'Singh'; } })(); console.log(name);
让我们用一种简单的方法逐行解决这个问题
1 → ‘Zakir’ 存储在变量名称中
3 → 我们进入一个自执行的匿名函数内部
4 → 变量名称重新初始化为 ‘Rahul’
5 → 遇到 return 语句,因此我们退出该函数
15 →将 name 变量打印到屏幕上,其当前值为"Rahul"
因此,最终输出将是
Rahul
但不幸的是,这是错误的,让我们再次检查代码,看看我们哪里出了问题,这次要牢记变量和函数提升的概念。
1 → "Zakir"存储在变量名称中
3 →我们进入一个自执行匿名函数内部
当我们进入该函数时,函数提升开始,在自执行函数底部定义的函数 name() 被提升到自执行函数的最顶部,并且在该中间状态下,代码将类似于 −
示例
let name = 'Zakir'; (() => { let name; name = 'Rahul'; return; console.log(name); name = function(){ let lastName = 'Singh'; } })(); console.log(name);
请注意,每当变量/函数被提升到其范围的顶部时,它只是被定义和初始化,它在其实际位置被初始化,在顶部它是未定义的,但它存在。
因此,当变量名称被重新初始化时,它是局部变量名称被重新初始化,而不是全局变量,因此,在此之后我们退出自执行函数并将全局变量名称打印到控制台,它仍然保留‘Zakir’。因此,输出将是−
输出
Zakir