IIFE 中的变量可在全局范围内访问

variables from IIFE accessible in global scope

这个IIFE的输出怎么是5?

(function() {
  var a = b = 5;
})();

console.log(b);

我尝试了 console.log(a) 但它给出了预期的参考错误 为什么 'b' 在全球范围内还活着?

发生这种情况只是因为您将 b 声明为全局变量,而不是局部变量。

(function() {
  var a = b = 5;
})();

由于 var,它可能 看起来 像是在本地定义的,但这仅适用于 a

来自 documentation.

The scope of a variable declared with var is its current execution context and closures thereof, which is either the enclosing function and functions declared within it

有趣的问题。尽管它与 IIFE 或提升完全无关。请注意“a”是如何未定义的!

您的代码示例

function test() {
  var a = b = 5;
}

在语义上等同于:

function test() {
  var a = 5;
  // this is essentially the same as `window.b = a`
  b = a;
}

由于您没有声明“a”(又名 var a;),它最终出现在全局范围内。 在严格模式下这是行不通的。

那是因为“泄漏”,这意味着无意中使局部声明的变量可用于全局范围。有关更多信息,请参见 here。让我们拆分您的代码:

var a = b = 5;

这意味着:ab 的值,即 5。变量 b 在这种情况下被隐式声明和初始化(使用 b = 5) ,并且由于您没有指定它的块范围(那是因为 var 指的是 a,而不是 b),它被限制在全局范围内。