与javascript var关键字相关的问题

时间:2011-03-16 04:41:25

标签: javascript scope

有谁知道为什么下面代码中的最后一个警告会抱怨a未定义。 a不应该是11因为它是在没有使用var关键字的情况下在four()中初始化的吗?感谢。

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

6 个答案:

答案 0 :(得分:2)

不,因为a已经使用“var”声明,对four()中的a的赋值引用了该声明的变量,并且a的范围限制为3()。

答案 1 :(得分:1)

var a位于函数three()

的本地范围内

答案 2 :(得分:0)

由于范围问题,最后一次警报会抱怨未定义。由于a是在函数内声明的,所以最后一行(你的警告语句)完全不知道a。

答案 3 :(得分:0)

function three() {
    var a = 12
    function four() {
        a = 11
        function five() {
             alert(a)
         }
    return five
    }
return four
}
three()()()
alert(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就可以了。

答案 4 :(得分:0)

此外,由于我们讨论的是JS中的范围主题,我想指出JavaScript中没有块范围,只有函数和全局。无论何时跳过var,声明都是全局的。这让很多人措手不及。

答案 5 :(得分:0)

由于变量a位于函数three的局部范围内,因此未定义。

这应该给出a

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

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