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

相关文章