【问题标题】:JavaScript Hoisting - Hoisted code after Memory Creation phaseJavaScript 提升 - 内存创建阶段后提升的代码
【发布时间】:2021-08-15 18:57:55
【问题描述】:

我正在阅读凯尔·辛普森 (Kyle Simpson) 的书:https://github.com/getify/You-Dont-Know-JS/blob/1st-ed/scope%20%26%20closures/ch4.md#functions-first

但我不完全理解这一行 “请注意 var foo 是重复的(因此被忽略)声明,即使它出现在 function foo()... 声明之前,因为 function声明在普通变量之前被提升。"

假设这是代码:

console.log(foo);     // The output is: foo() { return 2; }

function foo() {
    return 1;
}

function foo() {
    return 2;
}

var foo = 3;

我想可视化在内存创建阶段之后 JS 引擎中的输出。会是这样吗?

function foo() {
    return 2;
}

console.log(foo);

如果是,为什么var foo = 3; 被忽略了?在 sn-p 中,var 没有重复项。如果没有,谁能帮我想象一下在内存创建阶段之后 JS 引擎的输出是什么?

谢谢

【问题讨论】:

    标签: javascript hoisting


    【解决方案1】:

    我认为文字是指

    // scope creation
    var foo; // the name was declared. Thrice.
    foo = undefined; // from the var
    foo = function foo() { return 1 }; // from the first declaration
    foo = function foo() { return 1 }; // from the second iteration
    
    // execution
    console.log(foo);
    ;
    ;
    foo = 3;
    

    由于var foo 声明,foo 使用 undefined 初始化,但随后被优先的 function foo 声明中的初始化值覆盖 - 无论声明出现在代码,function 声明优先于 var 声明。

    【讨论】:

    • "但是在书中它说,首先提升函数,然后是变量" - 哦,好吧。不同的方法,一些结果。虽然我选择说变量首先出现然后被覆盖,但书中说“多个/重复的 var 声明被有效地忽略”,即变量排在第二位,但不会覆盖函数。这是hoisting is a bad metaphor 的另一个原因,没有代码被“移动”并且没有任何东西是可观察到的,重要的是执行开始时的结果状态。
    • 顺便说一句,你真的应该阅读the second edition of the book,而不是第一个。
    • 非常感谢您的解释和链接。非常感谢您的努力:)
    【解决方案2】:
    • 函数声明
      1. 声明一个与函数同名的变量(这是提升的)
      2. 将函数分配给该变量(已提升)
    • var 具有关联分配的语句
      1. 声明一个具有该名称的变量(已提升)
      2. 将值分配给该变量(这是提升)

    var foo = 3 不会被忽略。

    变量声明 (var foo) 被忽略,因为之前的函数声明已经声明了该变量。 (即因为它重复了foo 的声明)。

    foo = 3 不会被忽略,并且确实将 3 分配给 foo ...它只是这样做您的 console.log 语句运行之后,因为它没有被托管。

    【讨论】:

    • 非常感谢您的解释和帮助。非常感谢您的努力
    猜你喜欢
    • 2018-08-02
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多