为什么这个警报5?

sav*_*ger 5 javascript

这里有一些奇怪的代码......

var x = 5;

function fn() {
    x = 10;
    return;
    function x() {}
}
fn();
alert(x);
Run Code Online (Sandbox Code Playgroud)

这是jsFiddle

function x() {}称为在所有之后return?为什么不提醒10?

Fré*_*idi 10

function x() {}提升fn范围的开头,这有效地使得x之前的局部变量x = 10;被评估.

该功能设置为10.

更新:上面的句子是错误的.x实际上是设置为10.var不使用声明,但即使是在下面的报价仅最后一句是指申报名称的一部分x,而不是它分配10.

来自MDN(强调我的):

功能

具有不同范围行为的三种形式:

  • 声明:作为父函数顶级的声明
    • 行为类似于初始化为该函数的var绑定
    • 初始化"提升"到父函数的最顶层,在vars之上

VAR

  • 函数作用域
  • 提升到其功能的顶部
  • 同一范围内同名的重新声明是无操作