javascript中的IIFE和全局范围

javascript中的IIFE和全局范围,javascript,global-variables,iife,Javascript,Global Variables,Iife,为什么以下代码导致b的日志记录,而a仍然未定义 (function(){ var a=b=5; })(); console.log('b:'+b); console.log('a:'+a); 因为var a=b=5语句只定义局部变量,实际上解释如下 var a = (b=5); 等于 b = 5; var a = 5; 它将5分配给全局b变量,并定义局部a变量 定义2个局部变量而不重复值的正确方法是 var b = 5, a = b; 变量可通过两种方式定义: 变量a=5//首先 a=

为什么以下代码导致
b
的日志记录,而
a
仍然
未定义

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

因为
var a=b=5
语句只定义局部
变量,实际上解释如下

var a = (b=5);
等于

b = 5;
var a = 5;
它将
5
分配给全局
b
变量,并定义局部
a
变量

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

var b = 5, a = b;

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

  • 变量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
实际上从未在这里声明过,只是赋值了-使其成为一个全局变量

因此,函数外部的log语句可以访问
b
,它将其值打印为
5

换句话说,在“严格”模式下,代码将如下所示:

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

console.log(b);

你指的“拳头法”和“第二法”是什么?谢谢@samrat,“严格”模式揭示了这个漏洞。