总是搞不清楚的作用域

82 阅读1分钟
    //例子1:
    var a = 10;    
    function a1(){      
        console.log(a);    
    }    
    function a2(){      
        var a = 20;      
        a1();    
    }    
    a2();  //10


    //例子2:
    var a = 10;    
    function a1(){      
        console.log(a);    
    }    
    function a2(y){      
        var a = 20;      
        y();    
    }    
    a2(a1);   //10

    //例子3:
    function a2(y){      
        var a = 20;      
        function a1(){        
            console.log(a);      
        }      
        return a1    
    }    
    var a = 10;    
    var b = a2();    
    b(); //20

说明函数作用域是其声明定义时所在作用域,与运行调用时所在的作用域无关

<script>        
    var a = 10;    
    var c = {      
        m:20,      
        n:30    
    }    
    function a1(ra,c){      
        // 传入的a是原始类型,值复制,a这个形参相当于在这个函数内部      
        //var ra;ra=1;是函数的内部变量      
        return function(){          
            return ra++ +'---'+c.m++      
        }    
    }    
    var b = a1(a,c);    
    console.log(b());  //10---20    
    console.log(b());  //11---21    
    console.log(b());  //12---22    
    console.log(a);    //10    
    console.log(c.m);  //23      
</script>

通过闭包,ra的状态被保留,所以每次调用b()函数都是在上一次的基础上进行计算,ra会被保存在内存中