JavaScript 函数范围

JavaScript Function Scope

本文关键字:范围 函数 JavaScript      更新时间:2023-09-26

我有问题,与JavaScript Scope有关:-

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

上面给我的输出为"未定义"2010

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

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

谢谢

吊装:分散变量的问题

JavaScript 使您能够在函数中的任何位置拥有多个 var 语句,并且它们的行为都好像变量是在函数的顶部声明的。此行为是称为吊装。当您使用变量时,这可能会导致逻辑错误,然后您在函数中进一步声明它。对于 JavaScript,只要变量在相同作用域(相同的函数),它被认为是声明的,即使它在 var 之前使用声明。看看这个例子:

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

在此示例中,您可能期望第一个 alert() 将提示"全局"和第二个将提示"本地"。这是一个合理的期望,因为在第一个警报,myname 未声明,因此函数可能应该"看到"全局我的姓名。但这不是它的工作原理。第一个警报将显示"未定义"因为 myname 被视为声明为函数的局部变量。(虽然声明在之后。所有变量声明都被提升到顶部功能。因此,为了避免这种类型的混淆,最好预先声明所有变量您打算使用。

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

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

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