首页 > 解决方案 > JavaScript 提升 - 内存创建阶段后提升的代码

问题描述

我正在阅读凯尔辛普森的书: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;被忽略?片段中没有重复的 for var。如果没有,任何人都可以帮我想象一下在内存创建阶段之后 JS 引擎的输出是什么?

谢谢

标签: javascripthoisting

解决方案


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

var foo = 3不被忽视。

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

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


推荐阅读