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

javascript hoisting: what would be hoisted first — variable or function?

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

所以,有两个例子。

var alpha = 'alpha';

var beta = 'beta';

f(); //beta


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

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

f(); // alpha

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

但是第二个给了我一个推动,我有点不明白。

var alpha = 'alpha';

var beta = 'beta';

f();  // - alpha


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

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


f(); // beta

为什么变量f没有被提升到out代码的顶部,覆盖掉我们之前提升的函数? 为什么在 "first f" 电话中我收到 "alpha"。我认为,这一定是一个错误,例如: "f is not a function",因为在 first f 调用中我例外,f 将是 "undefined".

从技术上讲,这两个片段是相同的

类似

function f() {
    console.log(alpha);
}
var alpha = 'alpha';
var beta = 'beta';
var f; // ignored because f is already defined
f();  // - first f
f = function f1() {
    console.log(beta);
};
f(); // ** - second f

或者也许 - 不过,我很确定 function 是 "hoisted" 第一个

var alpha = 'alpha';
var beta = 'beta';
var f;
function f() {
    console.log(alpha);
}
f();  // - first f
f = function f1() {
    console.log(beta);
};
f(); // ** - second f

鉴于var foo = something,只有变量声明被提升。

这意味着 var foo 被提升,但 foo = something 将 运行 按阅读顺序排列。

给定function foo() {},变量声明函数赋值都被提升。这将创建变量 foo 并为其赋予函数的值。

如果你有以上两种情况,那么你声明变量两次(没有额外的效果)并为其赋值函数的值(因为这是唯一的赋值)。

所以在你的第二个例子中……

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

函数表达式的赋值没有被提升,但是 f(); // ** - second f 以正常的阅读顺序出现在它之后,所以第二次调用 foo() 命中那个。