Javascript 在 IIFE 中声明的链式变量赋值获得全局可见性?

Javascript chained variable assignments declared inside IIFE gets global visibility?

最近有人问以下 JavaScript 代码会产生什么结果,正确答案让我感到困惑:

(function () {
    var a = b = 5;
})();
console.log(b);

我原以为这会打印 undefined 但它实际上打印 5.

根据我的理解,IIFE(立即调用的函数表达式)中定义的所有变量都应该在其范围之外可见。这些变量声明的顺序究竟如何使 b 在其范围外可见而 a 在其范围外不可见?

这个:

var a = b = 5;

相当于:

b = 5;
var a = b;

不会

var b = 5;
var a = b;

它创建b作为一个全局的,然后将b的值赋给a

严格模式下也是禁止的。始终使用严格模式!

"use strict";

(function () {
    var a = b = 5;
})();
console.log(b);

您的代码等同于此

(function () {
    b = 5;
    var a = b;
})();
console.log(b);

如果您声明一个没有 var, let or const 的变量,它将是全局变量并分配给 window 对象(在浏览器的 JS 中),因此可以从任何地方访问它。

在一个语句中声明多个 var 的语法是:

var a, b;
// or:
var a = 5, b = 5;

你有的是var a的声明,但是b是值表达式的一部分,不受var的影响,所以泄漏到全局范围。