需要有关范围示例的详细信

时间:2017-03-15 11:48:01

标签: javascript scope nested

我正在学习JS的范围,而我却坚持一个例子:

function one() {
 var a = 1;
 console.log(a);

  function two() {
   var a = a + 2;
   console.log(a);
   }

 two();

}

one();

运行此功能将输出 NAN 。 你能解释为什么它没有从函数 一个() 中取变量 而是选择再定义一次?我知道 var 再次对它进行了定义,但是为什么它没有使用来自父级的变量,这是一个嵌套函数?

谢谢!

更新:

据我所知,如果我错了,请纠正我,同样的变量名称可以出现在不同的范围内

 function one() {
 var a = 1;
 console.log( a );
}
function two() {
 var a = 2;  
 console.log( a );
}
one();   
two();

另外我知道一个范围内的代码可以访问该范围的变量或它之外的任何范围

 function one() {
 var a = 1;
  function two() {
   var b = 2;
   console.log( a + b );  
  }  
 two();
 console.log( a );         
 }
 one();

这就是为什么我感到困惑

1 个答案:

答案 0 :(得分:2)

  

我知道 var 再次对它进行了定义,但是为什么它没有使用来自父级的变量,这是一个嵌套函数?

因为...... var在嵌套范围内再次定义它。这意味着a中的twoa中的one不同;它是阴影(隐藏)one&#39; a的不同变量,因此two无法使用它。< / p>

所以,现在我们知道它是一个不同的变量,让我们看一下NaN two console.log的{​​{1}}:行< / p>

var a = a + 2;

是这样对待的:

var a;
a = a + 2;

默认情况下,没有初始化程序的新声明变量的值为undefinedundefined + 2NaN

如果我们将two更改为而不是阴影a,则two确实可以使用a

&#13;
&#13;
function one() {
    var a = 1;
    console.log(a);

    function two() {
        var b = a + 2;  // Note declaring b, and using a
        console.log(b);
    }

    two();
}

one();
&#13;
&#13;
&#13;