2011-03-16 59 views
1

有谁知道为什么在下面的代码中的最后警报抱怨a未定义。不应该是11,因为它在4()中初始化而不使用var关键字?谢谢。有关javascript的var关键字的问题

function three() { 
    var a = 12 
    function four() { 
    a = 11 
    function five() { 
     alert(a) 
    } 
    return five 
    } 
    return four 
} 
three()()() 
alert(a) 

回答

2

没有,因为一个已经被宣布为“无功”,分配到四个()是指声明的变量,和的范围限制为3个()。

0

由于范围问题,最后一次警报抱怨未定义。由于在函数中声明了a,因此最后一行(您的alert语句)完全不了解a。

0
function three() { 
    var a = 12 
    function four() { 
     a = 11 
     function five() { 
      alert(a) 
     } 
    return five 
    } 
return four 
} 
three()()() 
alert(a)  

简而言之,a没有定义,因为好,它没有定义。

您的函数外部没有变量a。为了简化它,一组曲线内的东西不在这组曲线之外存在。

你可以在函数之前定义它或把它传递到函数来解决这个

function three() { 
    a = 12 
    function four() { 
     a = 11 
     function five() { 
      alert(a) 
     } 
    return five 
    } 
return four 
} 
three()()() 
alert(a)  

编辑发表评论: Variables declared without var are always global,所以在3摆脱了var会做到这一点。

+0

值。这是为什么? – 2011-03-16 04:56:10

+0

没有var声明的变量总是全局范围 – sclarson 2011-03-16 05:01:04

1

var a是在功能局部范围three()

0

而且,由于我们正在对在JS范围的话题,我想指出的是,没有块范围在JavaScript中,唯一的功能和全球。任何时候你跳过var,这个声明都是全球性的。这引起了很多人的警惕。

+0

好的,如果是这样的话,为什么不应该是11,因为它没有var初始化? – 2011-03-16 04:52:46

+0

看起来这是迟到的,但我会把它放在这里 - 就像Ernest Friedman-Hill回答的那样,当在'four'范围内未发现'a'时,封闭范围被检查并找到'a'在'三'的范围内。但是,如果你在'three'中使用了''''而没有'var',你会看到你期望的行为。 – 2011-03-16 13:41:41

0

由于变量a位于函数的本地范围three中,因此您将得到未定义的值。如果我改变VAR一个= 12到12 =内部的三个(),那么它的工作原理

这应该给的a

function three() 
{ 
    var a = 12; 
    function four() { 
     a = 11; 
     function five() { 
      return a; 
     } 
     return five; 
    } 
    return four; 
} 

var b = three()()(); 
alert(b);