任何人都可以在另一个函数内解释这个函数的行为吗?

him*_*sag 3 javascript lexical-scope web

我试图理解Javascript中的词法范围.在下面的例子中,我在另一个函数中编写了一个函数.当我运行时,我希望在第一个警报中弹出"爸爸",在第二个警报中弹出"妈妈".但实际发生的是,它在第​​一个弹出窗口显示"未定义",在第二个弹出窗口显示"妈妈".

function first(){
  var x = "dad"; 
  function second(){
    alert(x);
    var x = "mom";
    alert(x);
  }
  second();
}
first();
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么在父函数中定义的变量"x"在子函数中不可见?奇怪的是,当我在子函数中删除变量"x"的声明时,它工作正常.有人可以在这里有效地了解词汇范围场景吗?

fgb*_*fgb 5

var x在"第二"所声明的变量"X",隐藏在外部函数的变量"X".在'second'函数中对'x'的任何引用都引用该变量,即使它在声明之前.声明之前变量的值将是"未定义".

您可以查看"吊装"以获取更多信息.请参阅:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html