javascript 中的 IIFE 和全局范围

IIFE and Global scope in javascript

为什么以下代码会导致记录 ba 仍然是 undefined

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

因为 var a=b=5; 语句仅定义局部 a 变量,实际上被解释为

var a = (b=5);

等于

b = 5;
var a = 5;

5 分配给全局 b 变量并定义局部 a 变量。

定义 2 个没有值重复的局部变量的正确方法是

var b = 5, a = b;

变量可以通过两种方式定义:

  • var a= 5 // 第一个
  • a=5 // 第二个

第一种方式a是局部变量,第二种方式变成全局变量

因此,当您执行 var a=b=5 时,b 是一个全局变量,因此保留值。

在JavaScript中,如果您在变量前省略 var 关键字,它将被视为全局变量。 所以这里 b 是一个全局变量, a 只是该函数范围的局部变量。 这就是为什么您在访问 a.

时出现错误的原因

没关系,我自己想通了,因为它不会让我睡觉。

IIFE 中发生了 2 次赋值,而只有 1 次声明。

语句var a=b=5;var声明了变量a,但只是简单地为另一个变量b赋值。 b 实际上从未在这里声明,只是赋值 - 使其成为 全局变量

因此 b 可在函数 外部的日志语句 访问,它将其值打印为 5.

换句话说,在'strict'模式下,代码将如下所示:

(function() {
   'use strict';
   var a = window.b = 5;
})();

console.log(b);