js中关于同名的情况(同名变量,同名函数,同名形参)

js中关于同名的情况(同名变量,同名函数,同名形参)

1.变量和函数重名时谁有效

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

个人理解:上述两种情况,发现变量a和函数a同名,区别在于变量a赋值了没,发现打印情况不同。var和funciotn声明会被提升,函数会首先被提升,注意:函数表达式不会被提升。
JavaScript在代码执行前会进行预编译,创建了一个GO(Global Object)对象。

GO{
a : function a(){},
}
上述情况1,遇到var a,因变量a已存在,直接忽略。所以打印均为函数。

GO{
a : function a(){} 1,
}
情况2,js引擎在执行遇到a = 1 时,就把原先变量a地址存放的指针替换,赋值为1。

2.全局变量和函数内变量重名时谁有效

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

个人理解:函数在执行的时候会生成函数作用域,该作用域在预编译时也会寻找var和函数声明的,若有则进行提升。上述情况区别是函数内变量a有无进行var声明:没有var声明则不会被提升,所以在执行到console时,发现该函数作用域无变量a,则向上查找,找到变量a,它的值为1;有var声明则会被提升,所以在执行到console时,发现该函数作用域有变量a,此时值为undefined。

3.局部变量、函数和函数形参重名时谁有效

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

当fn函数调用时,创建函数执行上下文,然后根据实参填充arguments对象,即:形参var a = arguments[0],然后根据函数内的函数声明将函数名a进行提升,此时会发现函数名和形参名发生了冲突,由于形参与arguments中的数据共享状态,所以接下来后提升的函数名a内存放的函数引用地址会将前面定义的形参名a指向的arguments[0]直接覆盖掉

你可能感兴趣的:(js中关于同名的情况(同名变量,同名函数,同名形参))