【问题标题】:Does Var variables get hoisted out of the IIFE? [duplicate]Var 变量是否会从 IIFE 中取出? [复制]
【发布时间】:2021-11-20 02:19:51
【问题描述】:

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

   

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 中,我们创建了一个全局变量 _3 并赋值为 35。
  2. 然后打印出 35。
  3. 我们在 IIFE 中创建了一个 Var variable_3 并赋值为 45。(这个 Var 是否被提升到了 IIFE 之外??)

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

谢谢!

【问题讨论】:

  • 输出不应该是那个(variable_3 不应该存在于函数之外)。您是否在浏览器 REPL 中运行此程序,并且不小心将之前实验的剩余部分保留在范围内?
  • 哦抱歉最后的结果应该是错误的。我从帖子中复制了问题,并没有自己测试。但是为什么那个变量 3 不存在呢?我们确实在 IIFE 的顶部声明它
  • 你最好使用严格模式,兼顾口译员的素质不是个好主意('use strict';)
  • @MisterJojo 谢谢,但我很想了解原代码的吊装过程。这有助于我理解原理并通过面试lol。
  • var 被提升到当前函数作用域的顶部。在variable_3 的示例中,这是 IIFE 本身的顶部,variable_3 在 IIFE 之外不可用。真的没有理由再用var 编程了。使用constlet 并将声明放在适当的位置。不要使用var

标签: javascript ecmascript-6 hoisting


【解决方案1】:
(()=> {
  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;

类似功能;在定义之前使用变量也可以;

【讨论】:

    【解决方案2】:

    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;

    【讨论】:

    • "基本上有两个作用域" - 可以有任意多个嵌套作用域
    猜你喜欢
    • 2015-12-22
    • 2021-11-28
    • 2015-04-26
    • 2019-10-28
    • 2012-09-28
    • 2012-11-10
    • 2018-10-21
    • 2012-06-26
    • 1970-01-01
    相关资源
    最近更新 更多