为什么以下代码会导致记录
b
而a
仍然是undefined
?(function(){ var a=b=5; })();
console.log('b:'+b);
console.log('a:'+a);
b
而a
仍然是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;
这段代码将全局变量b
赋值为5
,并定义了一个本地变量a
。
正确的方法是定义两个没有值重复的本地变量:
var b = 5, a = b;
没关系,我自己解决了,因为它不让我睡觉。
IIFE 中有 2 个分配,而只有 1 个声明。
语句var a = b = 5;
使用var
声明变量a
,但对其他变量b
仅进行赋值。
这里实际上从未声明b
,只是赋值 - 这使其成为一个全局变量。
因此,b
可以通过在函数外部的日志语句进行访问,该语句打印其值为5
。
换句话说,在“严格”模式下,代码将如下所示:
(function() {
'use strict';
var a = window.b = 5;
})();
console.log(b);
变量可以有两种定义方式:
第一种方式中,a
是一个局部变量,但是在第二种方式中,它变成了一个全局变量。
因此,当你执行 var a=b=5
时,b
是一个全局变量,因此保留了值。