JavaScript 自执行匿名函数中这个问题是什么?


假设这里有一段示例代码,我们需要说明这段代码可能的输出并解释原因。

var name = 'Zakir';
(() => {
   name = 'Rahul';
   return;
   console.log(name);
   function name(){
      let lastName = 'Singh';
   }
})();
console.log(name);

让我们用一种简单的方法逐行分析这个问题。

1 → ‘Zakir’ 存储在变量 name 中。

3 → 我们进入一个自执行匿名函数。

4 → 变量 name 被重新初始化为 ‘Rahul’。

5 → 遇到 return 语句,所以我们退出函数。

15 → 将 name 变量(当前值为 ‘Rahul’)打印到屏幕。

所以,最终输出将是

Rahul

但是,不幸的是,这是错误的。让我们再次仔细检查代码,这次要记住变量和函数提升的概念。

1 → ‘Zakir’ 存储在变量 name 中。

3 → 我们进入一个自执行匿名函数。

当我们进入函数时,函数提升生效,在自执行函数底部定义的函数 name() 被提升到自执行函数的顶部。在这个中间状态,代码将类似于:

示例

let name = 'Zakir';
(() => {
   let name;
   name = 'Rahul';
   return;
   console.log(name);
   name = function(){
      let lastName = 'Singh';
   }
})();
console.log(name);

请注意,每当变量/函数被提升到其作用域的顶部时,它只会被定义和初始化,它在其实际位置被初始化,在顶部它是未定义的,但它存在。

因此,当变量 name 被重新初始化时,是局部变量 name 被重新初始化,而不是全局变量。之后,我们从自执行函数返回,并将全局变量 name 打印到控制台,该变量仍然保存 ‘Zakir’。因此,输出将是:

输出

Zakir

更新于:2020年8月18日

107 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告