javascript hoisting:首先会悬挂什么 - 变量还是函数?

时间:2018-04-18 12:36:57

标签: javascript function variables hoisting

最近我对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 没有提升到输出代码的顶部,并且之前覆盖了我们提升的函数? 为什么在“first f”电话中我收到“alpha”。我认为,它必须是一个错误,如: “f不是一个函数”,因为在第一个f 调用中我很擅长,f将是“undefined”

2 个答案:

答案 0 :(得分:1)

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

类似

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是"悬挂"第一

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

答案 1 :(得分:1)

给定var foo = something,只提升变量声明。

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

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

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

所以在你的第二个例子......

函数声明已挂起,因此f(); // - first f会调用该函数。

函数表达式的赋值不会被提升,但f(); // ** - second f会在正常阅读顺序后显示,因此第二次调用foo()会触及该值。