声明变量的区别

时间:2016-05-27 06:48:26

标签: javascript

请告诉我以下两个代码之间的区别。

var a = 1; 
function b() { 
  a = 10; 
  return; 
} 
b(); 
console.log(a);

这会在控制台中打印10个。

而下面的代码在控制台

中打印1
var a = 1; 
function b() { 
  var a = 10; 
  return; 
  function a() {} 
} 
b(); 
console.log(a); 

感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

在第一个代码中有一个全局变量'a',可以被任何函数修改,并且该更改将是永久性的。

但是在第二个代码中,有两个'a'变量。让我们称他们为ag(全球)和al(本地)。在第二个代码中,b()函数修改al(局部变量a)而不是全局变量。但是我们在控制台中打印全局变量。

这就是为什么两个代码的结果都不同。

答案 1 :(得分:0)

它是一个范围的元素。在第一个声明只声明了函数b之外,所以当你编辑一个内部函数时,你正在引用"外部"一个。

在第二个片段中,您将在函数内部重新声明var a,因此当您在b函数内编辑变量时,您引用的是最新的离开未触及的"外部"变量。

答案 2 :(得分:0)

您已在函数内的第二个代码中声明a,因此变量a的范围(可用性)仅持续到函数执行。

一旦我们从函数返回,则局部变量a不再是因此外部全局a的值被打印。

答案 3 :(得分:0)

第一个示例很简单:您声明了a函数关闭的b变量。因此ba设置为10

你的第二个例子故意复杂而令人困惑。您声明了一个a变量b关闭,但阴影变量a变量b。更糟糕的是,a的函数声明也在b的范围内。 var胜过函数声明,因为函数声明是在var语句之前处理的。外a完全不受b的影响,因此最后的console.log会记录1。

使用各种图表更容易描述:

var a = 1;            // <== The declaration `b` closes over
function b() {
  var a = 10;         // <== The inner `a` variable
  return;             // <== Returns from `b`
  function a() {}     // <=== Declaration that was processed immediately
                      // upon entering `b` (the `return` doesn't affect it
                      // at all), but which is then superceded by `var a`
} 
b(); 
console.log(a);       // Logs 1

答案 4 :(得分:0)

当您使用var时,其范围将是其功能的本地范围。 如果没有var,它将成为一个全局函数。