JS中形参和隐式全局变量相同的情况

193 阅读1分钟

首先介绍一下隐式全局变量,隐式全局变量就是在函数中,只有赋值,但是没有进行关键字的声明,隐式全局变量在函数内外都可以访问到,除非将其进行删除。 当形参和隐式全局变量相同的时候,隐式全局变量的作用域就限制在函数中,具体情况分为基本数据类型和引用数据类型两种情况:

     var num2=66;
     function f1(num1,num){
    //省略了var num1,var num,这两个为局部变量,函数执行完就释放内存
       num=100;
       num1=100;
       num2=100;  // num2为全局变量,值从66-》100
       console.log(num);  //100
       console.log(num1);  //100
       console.log(num2);  //100
 }
       f1(num1,num2); // 100 100 100
       console.log(num1); //55
       console.log(num2);  //100
       console.log(num); //报错

当形参为引用数据类型时:

      var foo = {n : 1};
      (function(foo) {
          console.log(foo.n);  //1
          foo.n = 3;           //全局中foo中n的值改为3
          var foo = {n : 2};   //重新创建一个局部变量foo
          console.log(foo.n);  //2
      })(foo);
      console.log(foo.n);      // 3
      //等同于
      var foo = {n : 1};
       function fun(foo) {
        console.log(foo.n);  //1
        foo.n = 3;           //全局中foo中n的值改为3
        var foo = {n : 2};   //重新创建一个局部变量foo
        console.log(foo.n);  //2
       };
        fun(foo)
        console.log(foo.n);     //3

//当foo为基本数据类型时:

      var foo = 1;
      function fun(foo) {
          var foo;
          console.log(foo);    //1
          foo = 3;
          foo = 2;
          console.log(foo);    //2
      };
      fun(foo);
      console.log(foo);        //1