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

时间:2018-06-05 12:50:42

标签: javascript var iife

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

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

我原本以为这会打印undefined,但实际上会打印5

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

3 个答案:

答案 0 :(得分:5)

此:

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);

答案 1 :(得分:2)

您的代码与此相同

false

如果声明一个没有(function () { b = 5; var a = b; })(); console.log(b); 的变量,它将是全局变量并分配给var, let or const对象(在浏览器的JS中),因此可以从任何地方访问它。

答案 2 :(得分:1)

在一个语句中声明多个result.csv的语法是:

var

您所拥有的是var a, b; // or: var a = 5, b = 5; 的声明,但var a是值表达式的一部分,不受b的影响,因此泄漏到全局范围。