【问题标题】:javascript returns undefind for a globally declared variable [duplicate]javascript为全局声明的变量返回未定义[重复]
【发布时间】:2013-01-23 20:52:18
【问题描述】:

我是 javascript 的初学者。我有一个疑问。下面给出了我的代码。当我运行这个时,第一个警告框显示“未定义”。我不明白为什么?非常感谢..

<html>
<head>
<script type="text/javascript">
var a = 123;
   function foo()
   {
     alert(a);
     var a = 890;
     alert(a);
   }
     foo();
     alert(a); 
</script>
</head>
<body>
</body>
</html>

【问题讨论】:

标签: javascript


【解决方案1】:

这是因为在提升之后在执行之前,你的foo()函数内部看起来像:

function foo() {
    var a; // declaration hoisted to top
    alert(a); // the local var is 'undefined' at this point
    a = 890; // assignment operation not hoisted
    alert(a);
}

在此处阅读有关吊装的更多信息:

【讨论】:

【解决方案2】:

我相信这是因为变量声明提升。变量声明被提升到其范围的顶部。这意味着,从技术上讲,您的代码是这样执行的:

var a;
a = 123;
function foo()
{
  var a;
  alert(a);
  a = 890;
  alert(a);
}
foo();
alert(a); 

在这种情况下,a 首先是全局定义的,其值为undefined。然后,将其值设置为123。当函数被调用时,会立即在函数中声明一个新的a,并将undefined 值作为局部变量,这就是为什么首先提醒undefined。然后,将其值设置为890。所以即使你在函数中间使用了var,但这并不意味着它是这样执行的,因为有提升。

【讨论】:

  • 非常感谢..现在我明白里面发生了什么.. :)
【解决方案3】:

你将变量 a 初始化了两次,结果很奇怪。现在它的作用域是不同的。

<html>
<head>
<script type="text/javascript">
var a = 123;
   function foo()
   {
     alert(a);
     a = 890;
     alert(a);
   }
     foo();
     alert(a); 
</script>
</head>
<body>
</body>
</html>

【讨论】:

  • 你能解释为什么这是错误的吗?
  • 你能解释一下为什么这是正确的吗?没有对问题的真正解释,对您的代码没有真正的解释,以及与原始代码无关的代码。原始代码在函数中重新声明了a 变量,因此您没有理由认为它应该是整个代码中的全局变量。我确信 OP 有理由在本地重新声明 a,这并没有错。关键是变量提升带来的混乱。
猜你喜欢
  • 1970-01-01
  • 2016-05-13
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多