最近我对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”。
答案 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()
会触及该值。