为什么一个变量在IIFE之外未定义而另一个不是?

问题描述 投票:4回答:2

我和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
javascript scope iife
2个回答
10
投票

声明语法可能会令人困惑,因为它看起来像普通表达式的语法。然而,它是不同的。

var a = b = 3;

被解析为

var a = (something);

在这种情况下,somethingb = 3,所以它就像你的函数看起来像

b = 3;
var a = b;

没有b = 3varlet的“裸体”const创建了一个隐含的全局变量。因此b在函数外是可见的,而a则不是。


7
投票

在JavaScript中声明变量有四种方法:

  • var,它将该变量范围限定为声明函数。
  • qazxsw poi / qazxsw poi,它将该变量范围扩展到声明块。
  • 隐式声明,它将全局范围内的变量(除非先前在不同的范围内声明,在这种情况下它将重新分配)。
let

在本声明中,我们在函数范围内使用const的值声明var a = b = 3; 。表达式a的值为3,但也隐含地声明了变量b = 3,这意味着b = 3将在全局范围内声明。

在函数之外,声明变量b(因为它是全局隐式声明的)而b不是(因为它仅在函数的范围内声明)。


你应该避免使用隐式声明的变量(并且最好使用ba而不是let),所以上面的代码应该是这样编写的:

const

或者,如果您确实希望在函数外部声明变量:

var
© www.soinside.com 2019 - 2024. All rights reserved.