JavaScript函数范围

Yas*_*rit 2 javascript scope global-variables

我有问题,与JavaScript范围有关: -

var a = 10;
function show() {
   alert(a);
   var a = 20;
   alert(a);
}
show();
alert(a);
Run Code Online (Sandbox Code Playgroud)

上面给出的输出为"未定义"20 10

我理解了最后两个输出,但为什么在第一个警报中未定义,我将结果解释为10,20,10,因为它是一个脚本,它将逐行运行,所以当第一个警报将遇到它将处理全局并提醒我10但所有这些理论都出错了.

能否请您解释一下,我的实际理论是什么,我哪里错了

谢谢

小智 6

吊装:分散​​的变量问题

JavaScript允许您在函数中的任何位置具有多个var语句,并且它们都像在函数顶部声明变量一样.此行为称为提升.当您使用变量然后在函数中进一步声明它时,这可能导致逻辑错误.对于JavaScript,只要变量在同一范围内(相同的函数),即使在var声明之前使用它,也会被认为是声明的.看看这个例子:

myname = "global"; // global variable
function func() {
  alert(myname); // "undefined"
  var myname = "local";
  alert(myname); // "local"
}
func();
Run Code Online (Sandbox Code Playgroud)

在这个例子中,您可能期望第一个alert()将提示"global"而第二个将提示"local".这是一个合理的期望,因为在第一个警报时,myname未被声明,因此函数应该可能"看到"全球myname.但这不是它的工作原理.第一个警报将显示"undefined",因为myname被视为声明为函数的局部变量.(虽然声明在后面.)所有变量声明都被提升到函数的顶部.因此,为避免这种混淆,最好先声明要使用的所有变量.

前面的代码片段的行为就好像它是这样实现的:

myname = "global"; // global variable
function func() {
  var myname; // same as -> var myname = undefined;
  alert(myname); // "undefined"
  myname = "local";
  alert(myname); // "local"
}
func();
Run Code Online (Sandbox Code Playgroud)