js中预解析引起的结果,深入分析

最近做笔试题好多涉及到js预解析问题,我老是掉到坑里今天决定彻底终结它!!!

 

首先我们要知道,JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程。

我们从下面几个问题入手:

1.什么是预解析?

我们都学过html,我们知道html是从上到下依次解析的。但是js不同它会在执行页面代码之前,会先把页面代码都扫描一遍,然后声明式的函数和变量都提到所在作用域的最前端,这就是js的预解析。

2.预解析的过程是怎样的?

这里涉及两个提升,一个是函数提升,一个是变量提升。

1)变量提升,把变量的声明提升到当前作用域的最上面,不包括变量的赋值。

2)函数提升,把函数的声明提升到当前作用域的最上面,不包括函数的调用。

3.提升需注意的点?

先提升var,在提升function。

 

入门级例子:

1.

1   console.log(a);  //a is not defined

这里报错,a未定义,想必是个人都知道。

2.

1   console.log(a);
2   var a=5;              //undefined

这里可能就有一些人模糊了,不是变量提升吗,怎么还undefined???

这就是你忽略了重要的一点:变量提升不包括变量的赋值

下面我们来演示一下它的预解析过程:

1     var a;
2     console.log(a);//这里的a仅仅只是声明了一下,并没有赋值,所以返回undefined
3     a=5;

3.

1         f1();
2         function f1(){
3             console.log('hello');//hello
4         }

这个很简单了,预解析过程如下:

1         function f1(){
2             console.log('hello');
3         }
4         f1();

先声明函数在调用函数,之后输出结果。

 

走进门的例子:

1.

1         var a = 25;
2         function abc (){
3         console.log(a);//undefined
4         var a = 10;
5         }
6         abc();

这个可能大家又有一点懵了,函数内部也有变量外部也有不知道怎么分析了,别急,我们先预解析函数外面,在预解析函数里面:

 1         //函数外部预解析
 2         var a;
 3         function abc (){
 4             //函数内部预解析
 5             var a;
 6             console.log(a);//undefined
 7             a = 10;
 8         }
 9         a=25;
10         abc();

不论是全局变量a,还是局部变量a,我们都在解析console.log(a);前都只是声明了a,并没有赋值,所以是undefined。

2.

1         console.log(a);
2         function a() {
3         console.log('aaaaa');
4         }
5         var a = 1;
6         console.log(a);

输出结果:

 

 

 看到这里大家又懵了。。。。。。。还是那句话先梳理预解析过程

1         var a;
2         function a() {
3         console.log('aaaaa');
4         }
5         console.log(a);//这里输出了a()函数
6         a = 1;
7         console.log(a);//这里输出了1

这里我们要铭记一点:

如果变量和函数同名的话,函数优先,所以第5行代码调用了函数a()。
 
 

出门级例子:

1.

1         var a = 18;
2         f1();
3         function f1() {
4           var b = 9;
5           console.log(a);
6           console.log(b);
7           var a = '123';
8         }

输出结果:

 

 预解析过程:

 1         var a;
 2         function f1() {
 3             var b;
 4             var a;
 5             b = 9;
 6             console.log(a);
 7             console.log(b);
 8             a = '123';
 9         }
10         a=18;
11         f1();

到这里就可以一眼看出来了吧!!!

2.

 1         f1();
 2         console.log(c);
 3         console.log(b);
 4         console.log(a);
 5         function f1() {
 6             var a = b = c = 9;
 7             console.log(a);
 8             console.log(b);
 9             console.log(c);
10         }

结果:

 

 预解析过程:

 1         function f1() {
 2             var a ;
 3             a= b = c = 9;
 4             console.log(a);
 5             console.log(b);
 6             console.log(c);
 7         }
 8         f1();
 9         //这里我们要注意
10         //var a=9;
11         //b,c为全局变量
12         //b=9;
13         //c=9;
14         console.log(c);
15         console.log(b);
16         console.log(a);

这里要注意下全局变量和局部变量问题!!!

 

好啦!现在相信大家已经懂得差不多了,自己在弄几个实例多测试一下哦!!

博客写的一般,如有疑问评论区见!如果有用就点个赞吧!

谢谢大家!

posted @ 2021-03-11 21:54  一只蒟蒻也有大佬梦  阅读(109)  评论(0编辑  收藏  举报