javascript中的变量和函数范围

时间:2013-04-28 21:58:29

标签: javascript

我有这段代码

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

我期待5和6作为输出,但我有未定义和6而不是。

有什么想法?。

3 个答案:

答案 0 :(得分: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();

当您在函数内声明变量时,该变量将 shadow 具有在祖先范围中声明的相同标识符的任何变量。在您的示例中,您在全局范围内声明a。然后,在woot函数的范围内声明另一个具有相同标识符的变量。此变量将隐藏您在全局范围内声明的a

答案 1 :(得分:0)

variable declaration (var keyword)woot函数范围内提升,使其成为局部变量(遮蔽全局变量a)。它将初始化为undefined,并返回该值,直到您分配给它。

答案 2 :(得分:0)

时间:

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

.. a还不存在!如果您想使用外部a,则需要将其称为:

console.log( window.a );

删除你已经在功能中的a,你现在可以使用console.log(a);引用外部的console.log( window.a );(因为你的功能中没有了)

否则,请使用alphas区分两个{{1}}。