我在与IIFE玩耍时感到困惑。 a
的值为undefined
,但b
不是。为什么我可以在IIFE之外访问b
的值?
(function(){
var a = b = 3;
})();
console.log("a defined? " + (typeof a !== 'undefined')); // false
console.log("b defined? " + (typeof b !== 'undefined')); // true
答案 0 :(得分:10)
声明语法可能会令人困惑,因为它看起来像普通表达式的语法。但是,是不同的。
var a = b = 3;
解析为
var a = (something);
在这种情况下,something
是b = 3
,因此就像您的函数看起来一样
b = 3;
var a = b;
没有b = 3
或var
或let
的“裸” const
创建一个隐式全局变量。因此,b
在函数外部是可见的,而a
在函数之外是可见的。
答案 1 :(得分:7)
有四种在JavaScript中声明变量的方法:
var
,它将使该变量作用于声明函数。let
/ const
,它将把该变量的作用域声明为声明块。var a = b = 3;
在此语句中,我们在函数范围中声明a
,其值为b = 3
。表达式b = 3
的值为3,但也隐式声明了变量b
,这意味着b
将在全局范围内声明。
在函数之外,声明了变量b
(因为它是在全局范围内隐式声明的),而没有声明a
(因为它仅在函数范围内声明了)。
尽管如此,您应该避免隐式声明的变量(最好使用let
和const
而不是var
),因此上面的代码应该这样写:
(function() {
let a = 3;
let b = a;
});
或者,如果您实际上还希望在函数外部声明变量:
let a, b;
(function() {
// NOTE: not implicit declaration since a and b are both already declared
a = 3;
b = a;
})();