javascript 提升:首先提升什么——变量还是函数?

Ave*_*koz 5 javascript variables function hoisting

最近我对 javascript 提升行为感到困惑,现在我陷入了困境。

所以,有两个例子。

var alpha = 'alpha';

var beta = 'beta';

f(); //beta


var f = function f1() {
    console.log(beta);
};

function f() {
    console.log(alpha);
}

f(); // alpha
Run Code Online (Sandbox Code Playgroud)

第一个按预期工作,因为当 Javascript 设置词法环境时,函数声明会覆盖我们的变量 f(值为“未定义”)。

但第二个给了我动力,我不明白一些事情。

var alpha = 'alpha';

var beta = 'beta';

f();  // - alpha


function f() {
    console.log(alpha);
}

var f = function f1() {
    console.log(beta);
};


f(); // beta
Run Code Online (Sandbox Code Playgroud)

为什么变量f没有提升到代码的顶部,并覆盖之前我们提升的函数?为什么在“first f”调用中我收到“alpha”。我认为,这一定是一个错误,如:“f 不是函数”,因为在第一个 f调用中,我例外, f 将是“未定义”

Que*_*tin 2

鉴于var foo = something,仅提升变量声明。

\n\n

这意味着它var foo已被提升,但foo = something将按读取顺序运行。

\n\n

鉴于function foo() {},变量声明函数赋值都被提升。这将创建变量foo并赋予它函数的值。

\n\n

如果您拥有上述两者,那么您可以声明该变量两次(没有额外的效果)并为其分配函数的值(因为这是唯一的分配)。

\n\n

所以在你的第二个例子中\xe2\x80\xa6

\n\n

函数声明被提升,因此f(); // - first f调用它。

\n\n

函数表达式的赋值不会提升,而是f(); // ** - second f按正常读取顺序出现在它之后,因此第二次调用会foo()命中该赋值。

\n