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>