2

我有一个与 JavaScript Scope 有关的问题:-

var a = 10;
function show() {
   alert(a);
   var a = 20;
   alert(a);
}
show();
alert(a);

以上给我的输出为“未定义”20 10

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

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

谢谢

4

2 回答 2

6

提升:分散变量的问题

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

myname = "global"; // global variable
function func() {
  alert(myname); // "undefined"
  var myname = "local";
  alert(myname); // "local"
}
func();

在此示例中,您可能期望第一个 alert() 将提示“global”,第二个将提示“local”。这是一个合理的预期,因为在第一次警报时,未声明 myname,因此该函数可能应该“看到”全局 myname。但这不是它的工作原理。第一个警报将显示“未定义”,因为 myname 被认为是函数的局部变量。(尽管声明在后面。)所有变量声明都被提升到函数的顶部。因此,为了避免这种类型的混淆,最好预先声明您打算使用的所有变量。

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

myname = "global"; // global variable
function func() {
  var myname; // same as -> var myname = undefined;
  alert(myname); // "undefined"
  myname = "local";
  alert(myname); // "local"
}
func();
于 2013-11-12T12:53:51.827 回答
1

查找变量提升,变量定义得到提升初始化不。

于 2013-11-12T12:53:21.223 回答