JS练习--函数声明提升、变量作用域

<script type="text/javascript">
    /*题目1*/
    // a();
    // function a(){                         //函数声明
    // console.log('a');
    // }
    // b();
    // var b = function(){console.log('b')}  //函数表达式

    /*题目2*/
    var x=1,y=2;                    //变量1
    var z = function(){
        var x = 1;                 //变量2
        return {                   
            x:x,
            y:function(a,b){
                x = a+b            
            },
            z:function(){
                return x;
            }
        }
    }
    a = z();
    a.y(x,y);                    //改变的是变量2
    alert(a.z());
    alert(a.x);
    alert(x); 
</script>

  

<script type="text/javascript">
    /*题目1*/
    a();                //打印出“a”
    function a(){       //函数声明提升,在js引擎执行的时候,先执行的这个函数的定义。所以上面的a(),打印出“a”
    console.log('a');
    }
    b();                //提示b不是function
    var b = function(){console.log('b')}   //函数表达式,只是将b的定义放了上去,赋值的部分运行到这一步才会执行。


    /*题目2*/
    var x=1,y=2;
    var z = function(){
        var x = 1;
        return {
            x:x,
            y:function(a,b){
                x = a+b
            },
            z:function(){
                return x;
            }
        }
    }
    a = z();          //z()返回一个object,并赋值给a
    a.y(x,y);         //x y取全局变量下的x y,在执行y函数的时候,y函数内部没有变量x,根据原型链往上找,找到了z函数内的变量x,将结果3赋给这个x
    alert(a.z());     //z函数内部也没有变脸x,顺着原型链,找到z函数内的x,返回3,所以弹出3
    alert(a.x);       //访问a的静态属性x,x在初始化时被赋值为1,所以弹出1
    alert(x);         //全局变量下的x没有变,弹出1
</script>

 

posted on 2017-02-06 15:59  王雪皓  阅读(220)  评论(0编辑  收藏  举报