关于js中的全局变量和局部变量

在学习JS的变量作用域时,发现的一些奇怪现象。记录如下:

 

 1 //全局变量:在全局作用域下的变量
 2     //局部变量:在函数内部声明的变量
 3     //注意:
 4         //1、在函数内部没有var声明直接赋值的变量也是全局变量
 5         //2、当变量名重复时,选择就近原则访问
 6     var num0 = 0;
 7     var num1 = 10;
 8     function f4() {
 9         var num2 = 20;
10         num3 = 30;
11         num0 = 0.1; // 给局部变量赋值
12         console.log(num0); //0.1  局部变量
13         console.log(num1); //undefined   局部变量,下方声明并赋值,这里显示未赋值
14         console.log(num2); //20 局部变量
15         console.log(num3); //30 全局变量 因为num3未声明
16         var num0; //声明了num0,所以是局部变量
17         var num1 = 11; //声明并赋值
18         console.log(num1); //11 局部变量
19         var num4 = 40;
20         console.log(num4); //40
21         num4 = 44; // 前面已经声明,所以是局部变量
22         console.log(num4); //44
23     }
24     f4();
25     console.log(num0);//0
26     console.log(num1);//10
27     console.log(num2); //error
28     console.log(num3); //30
29     console.log(num4); //error

后来发现这是由于js的预解析处理模式导致的。

 js引擎运行js分为两步:预解析+代码执行
  1、预解析:js引擎会把js里面的所有的var(变量解析)和function(函数解析)提升到当前作用域的最前面;
  2、代码执行:顺序执行

如:
  f5(); //预解析后,在函数上面也可调用,这在python中可不行哦。
  function f5() {
  }
  f5();

 

  f6();//报错
  var f6 = function () {
  };
  f6();

相当于:

  var f6;

  f6();

  f6 = function () {

  };

posted @ 2020-06-11 10:58  天青色wy  阅读(762)  评论(0编辑  收藏  举报