闭包作用域问题,新手表示不理解

//闭包
var a = 5;
var color = 'red';
function woot(){
    console.log(color)      //red
    console.log(a)          //undefined
    var a = 6;
    function test(){
        console.log(a == 6);   //true
    }
    test();
}
woot();

问题:我在window全局变量下定义了两个变量,分别是变量a和color,我们知道这两个变量是基本值类型number和string,然后在下面定义了一个闭包,但是在woot函数里面能访问到color的值red,却输出不了a的值5,根据我学过的知识,知道作用域链是里面的能访问上一层作用于链,层层递进直到window全局,但是在我这个例子中却有点说不通,因为在woot里面并没有输出a的值,哪位大神能否解答一下。


下面是我画的作用域图:

clipboard.png

阅读 3.2k
5 个回答
function woot(){
    console.log(color)      //red
    console.log(a)          //undefined
    var a = 6; 
    function test(){
        console.log(a == 6);   //true
    }
    test();
}

单看woot函数,其中先console.log(a),但是后面就是var a = 6;,变量和函数定义都会提升,也就是上面代码会变成下面这样。

function woot(){
    function test(){
        console.log(a == 6);   //true
    }
    var a;
    console.log(color)      //red
    console.log(a)          //undefined
    a = 6; 
    test();
}

你的console.log(a)不是输出a的么

var a=6,变量声明会被提前,赋值会在当前行。

新手上路,请多包涵

采纳了还可以写吗?

你这个第二次定义a相当于重新定义a,而第二次定义的a发生变量提升,但是赋值却在输出下面,所以造成无定义,你讲第二次那个var去掉试试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题