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(); // alphaRun 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(); // betaRun Code Online (Sandbox Code Playgroud)
为什么变量f没有提升到代码的顶部,并覆盖之前我们提升的函数?为什么在“first f”调用中我收到“alpha”。我认为,这一定是一个错误,如:“f 不是函数”,因为在第一个 f调用中,我例外, f 将是“未定义”。
鉴于var foo = something,仅提升变量声明。
这意味着它var foo已被提升,但foo = something将按读取顺序运行。
鉴于function foo() {},变量声明和函数赋值都被提升。这将创建变量foo并赋予它函数的值。
如果您拥有上述两者,那么您可以声明该变量两次(没有额外的效果)并为其分配函数的值(因为这是唯一的分配)。
\n\n所以在你的第二个例子中\xe2\x80\xa6
\n\n函数声明被提升,因此f(); // - first f调用它。
函数表达式的赋值不会提升,而是f(); // ** - second f按正常读取顺序出现在它之后,因此第二次调用会foo()命中该赋值。