Var 变量会被提升到 IIFE 之外吗?

Does Var variables get hoisted out of the IIFE?

我有一段代码,我想确切地知道 运行 顺序以及为什么结果是这样的:

   

var variable = 10;
(()=>{
    variable_3 = 35;
    console.log(variable_3);
    var variable_3 = 45;
    variable_2 = 15;
    console.log(variable);
})();

console.log(variable_2);
console.log(variable_3);
var variable=30;

这段代码的输出是

35, 10, 15, Error

我的理解是:

  1. 在 IIFE 中,我们创建了一个全局 variable_3 并分配了 35.
  2. 然后打印出35。
  3. 我们在IIFE中创建了一个Varvariable_3并分配了45。(这个Var是从IIFE中吊出来的吗??)

35.10.15 我明白了,你能解释一下最后一个数字,让我的逻辑正确吗?

谢谢!

(()=> {
  a = 123;
  console.log(a);  // 123
  console.log(window.a); // undefined
  var a;
})();
(()=>{
  var a = 4;
  (()=>{
    console.log(a);  // undefined
    var a = 5;
  })()
})()
(()=>{
  var source = {};
  (()=>{
    a = source;
    var a;
    console.log(a === source) // true
    // The variable source is indeed assigned to variable a, although variable a is declared after
  })()

})()

var变量是一个定义 喜欢功能, 函数可以在定义前使用;

main();
function main(){}

所以

a = 1;
var a;

喜欢的功能;在定义之前使用变量也可以;

1.)基本上有两种作用域,即局部作用域和全局作用域。功能 范围在本地范围内。

2.)提升将声明移动到当前范围的顶部。

3.)如果你给一个之前没有声明过的变量赋值,它会被自动声明为一个全局变量(即使它在一个函数中)并用赋值初始化。

4.)在局部函数作用域内,用var、let或const关键字声明都会创建一个局部变量。它仅在该功能内可用或可访问。

你的情况:

var variable = 10;//global variable declaration, outside the function.
(()=>{
    variable_3 = 35;//declares a global variable, ref. (3).
    console.log(variable_3);//prints 35, because it is available globally now.
    var variable_3 = 45;//re-declaration turns it to local variable, ref. (4).
    variable_2 = 15;//declares global variable, ref. (3)
    console.log(variable);//prints 10, because it is a global variable.
})();

console.log(variable_2);//prints because it is a global variable
console.log(variable_3);//fail to print because of re-declaration which changed it from a global variable to local function variable.
var variable=30;