执行环境-细节

71 阅读1分钟

细节1

   test();
   function test(){
      //这里的a是全局的a
      a = 5;
   }
   console.log(window.a);//5
   

细节2

   test(1);
   function test(a){
      function a(){}
   }
   //a开始进入申明undefined, 
   //接着实参赋值a=1,
   //后续找函数申明,function a(){} 这里也叫名字a  那么会进行赋值操作 a = function a(){}
   //注意:函数名如果和var 申明的名字重复,在解析环境的时候其实执行的是3

细节2的扩展

   var a = 1;
   function a(){}
   console.log(a);//1

虽然这里输出的是1,但是实际a的值经历了2次改变
最开始 var申明 a=undefined
接着 找函数体 a=function a(){}
最后 逐行执行 a=1

不信进行验证

   var a;
   function a(){}
   console.log(a);//这里并不是undefined
   a=1;
   console.log(a);

image.png

细节

如果形参已经用了一个变量名字,那么函数体内部var申明的变量名无效,但是赋值操作有效

 test(1);
 function test(a){
     console.log(a);//输出形参的值
     var a;//等于没有申明
     console.log(a);//还是形参的值
     a=5;
     console.log(a);
 }

执行流程:
1.找形参,和var申明 var a=undefiend //这里的a是形参的,后续var a等于无效
2.实参赋值给形参 a=1;
3.逐行执行 a=5

image.png