2013-04-28 89 views
0

我有这样一段代码变量和函数范围在javascript

var a = 5; 
function woot(){ 
    console.log(a); 
    var a = 6; 
    function test(){ console.log(a);} 
    test(); 
    }; 
woot(); 

我期待5和6作为输出,但我有不确定和6代替。

有什么想法?

+0

首先想到:我没有预料到'5'。你在问什么?你需要它是'5'吗? – Bergi 2013-04-28 21:59:46

+0

是的,在我正在编写的教程中,它应该是5,但是当我尝试它时,它给出了未定义。 – Misaki 2013-04-28 22:01:20

+1

您可以显示/链接该教程吗?如果它告诉你应该有一个5,这是错误的。 – Bergi 2013-04-28 22:03:57

回答

4

变量声明悬挂在它们出现的范围的顶部。你的代码是这样解释:

var a; // Outer scope, currently undefined 
a = 5; // Outer scope, set to 5 

function woot(){ // Function declaration, introduces a new scope 
    var a; // Inner scope, currently undefined 
    console.log(a); // Refers to inner scope 'a' 
    a = 6; // Inner scope, set to 6 
    function test(){ console.log(a);} // Refers to inner scope 'a' (now 6) 
    test(); 
    }; 
woot(); 

在声明函数内部的变量,这个变量将影子与已在祖先的范围被宣布为相同标识符的任何变量。在你的例子中,你在全局范围内声明a。然后您在woot函数的范围内声明具有相同标识符的另一个变量。这个变量会影响你在全局范围内声明的a

+0

我无法理解这个区别,以及悬挂的含义是什么?此外,它仍然给未定义 – Misaki 2013-04-28 22:02:35

+4

@ user2224801:这意味着,内'woot' *阴影*(将取代)的'VAR了'全局变量'了'与局部变量'了',甚至'var'前行。正如詹姆斯在他的重写中所展示的那样,'var'线被提升[“悬挂”到了它出现的函数的顶部。但是,这只是声明,而不是初始化,所以当用'var'声明一个变量时,它的初始值是'undefined',并且它只在赋值(或初始化)时获得另一个值。详情:[*差,误解'var' *](http://blog.niftysnippets.org/2008/03/poor-misunderstood-var.html) – 2013-04-28 22:05:16

+0

ahaaaa,所以,如果我从活泉除去一个变种,这将解决这个问题。 – Misaki 2013-04-28 22:08:22

0

variable declaration (var keyword)woot功能的范围悬挂,使其成为一个局部变量(阴影全局变量a)。它将被初始化为undefined,并返回该值直到您分配给它。

0

在的时间:

function woot(){ 
console.log(a); 

..the a犯规存在呢!如果你想使用外a你需要调用它像:

console.log(window.a); 

删除已在功能上a,你可以使用,轻松现在,这console.log(a);这将参考外一个(因为没有在你的函数了)

否则,使用console.log(window.a);区分这两个alphas