【问题标题】:Javascript chained variable assignments declared inside IIFE gets global visibility?在 IIFE 中声明的 Javascript 链式变量赋值获得全局可见性?
【发布时间】:2018-06-05 12:50:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • b 在此处全局声明。 var a, b = 5 将在本地声明两者,但不会将任何内容分配给 a
  • 又一次"use strict" 可以避免所有的痛苦。

标签: javascript var iife


【解决方案1】:

这个:

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

【讨论】:

    【解决方案2】:

    你的代码等于这个

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-11
        • 1970-01-01
        • 2021-11-17
        • 2010-11-29
        • 2010-09-17
        • 2011-05-09
        • 1970-01-01
        相关资源
        最近更新 更多