JavaScript 提升 - 内存创建阶段后的提升代码

JavaScript Hoisting - Hoisted code after Memory Creation phase

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

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

假设这是代码:

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;被忽略了?片段中 var 没有重复项。如果不是,谁能帮我想象一下内存创建阶段后 JS 引擎的输出是什么?

谢谢

  • 函数声明
    1. 声明一个与函数同名的变量(这是提升的)
    2. 将函数分配给该变量(已提升)
  • var 语句与关联赋值
    1. 声明一个具有该名称的变量(已提升)
    2. 将值分配给该变量(这是提升)

var foo = 3不忽略

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

foo = 3 不会被忽略,并且会将 3 分配给 foo ......它只是这样做 after 你的 console.log 声明运行,因为它没有托管。

我觉得文中指的是

// 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;

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