JavaScript中的立即调用函数表达式(IIFE)和全局作用域

3
为什么以下代码会导致记录ba仍然是undefined
(function(){ var a=b=5; })();
console.log('b:'+b);
console.log('a:'+a);
4个回答

5

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

var a = (b=5);

相当于
b = 5;
var a = 5;

这段代码将全局变量b赋值为5,并定义了一个本地变量a

正确的方法是定义两个没有值重复的本地变量:

var b = 5, a = b;

1
在JavaScript中,如果您在变量前省略了var关键字,它将被视为全局变量。因此,在这里,b是全局变量,而a仅限于该函数的作用域。这就是为什么在访问a时会出现错误的原因。

0

没关系,我自己解决了,因为它不让我睡觉。

IIFE 中有 2 个分配,而只有 1 个声明。

语句var a = b = 5;使用var声明变量a,但对其他变量b仅进行赋值。 这里实际上从未声明b,只是赋值 - 这使其成为一个全局变量

因此,b可以通过在函数外部的日志语句进行访问,该语句打印其值为5

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

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

console.log(b);

0

变量可以有两种定义方式:

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

第一种方式中,a 是一个局部变量,但是在第二种方式中,它变成了一个全局变量。

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


你所指的“第一种方法”和“第二种方法”是什么? - zerkms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接