JavaScript IIFE 函数和变量作用域

JavaScript IIFE functions and variable scope

正在阅读JavaScript拼图!,我一直在跟进,直到遇到这种情况。

密码

var name = "abc";
(function () {
    console.log(name);
    var name = "xyz";
    console.log(name);
}) ();

returns

undefined
xyz

但是这个

var name = "abc";
(function () {
    console.log(name);
}) ();

returns

abc

我很困惑,为什么name未定义是第一次调用的第一个代码?我猜这是因为 JavaScript 吊装和其他原因。这两段代码有什么不同?

这与您猜想的IIFE, this is just var hoisting无关。如果使用经典函数,您也会遇到同样的情况。

您在 IIFE 中的某处 重新声明 name 这一事实取消了此 IIFE 中 name 的全局范围。所以你第一次在你的 IIFE 中调用 name 时,它的行为是未声明的,因此是 undefined.

您可以通过注释和取消注释一行来使用这个 fiddle 测试 var 提升 概念。