关于JavaScript函数的一些事——预解析

来源:互联网 发布:网络直播培训机构红人 编辑:程序博客网 时间:2024/05/21 09:17

   这是我第一次写技术类的博客;与其说是技术不如说是我自学JavaScript过程中遇到的一些问题和难点;对学习的一些总结。想与大家分享,望多多指正。

       在自学过程中遇到了很多的问题,由于自己跨专业学习web前端,开始学习起来有点吃力,随着对其深入的了解和思考,许多问题渐渐的清晰明朗。希望与自学前端的人们一起共勉。今天主要分析的是JavaScript函数的预解析。在自学过程中,运行关于函数的一些代码,会出现很多意料之外的结果,让人不能理解。下面分析总结一下。

    片段一:

         

   我们都应该见过这种情况,为什么会出现undefined呢?或许有人会说程序是由上到下来执行的,这样理解虽然没有错,但是我们应该更加深入的去了解。在<script></script>之间的程序相当于在一个区间里,或者称为在一个域里,函数对于域的概念更加明显;浏览器在读到js中的程序时,并不会立马去执行。而是要去分析,分析好了后才开始执行;也就是说大致可以分为两个过程;1.分析程序(预解析);2.执行程序;

   那它怎么分析的呢?经过多方面的了解;大致为:解析器(对浏览器不是太了解;不知道浏览器里有没有解析器这一说法;先说成解析器吧)在进行代码分析的时候会找一些东西;这个找东西的过程便是所谓的预解析;那这些东西是什么呢?是varfunction、参数这三个;

   预解析:片段一的代码中在执行前;先去找varfunction、参数。片段里没有function和参数;只找到了var关键字;找到以后开启一个名字叫a仓库,但并不会保存变量1;此时会保存a=undefined;此时预解析完成;

   执行程序:在预解析完成以后开始执行程序;此时逐行读代码;读到console.loga)时,仓库里只有a=undefined;故运行结果为undefined;在继续读程序;读到var =1;这一行的时候;在将变量1赋值给仓库里的a

   片段二:

 

  对于片段二在执行代码之前我们同样要进行预解析;其过程如下

  预解析:寻找关键字var、function、参数;在第10行找到了var;此时给a赋值undefined;第12行代码找到了函数a;此时a=function a(){}函数本身;此时会发现,a重名了,此时函数声明会优于变量声明;函数会覆盖变量(这点请记住)于是“仓库”只会存在a=function a(){}。预解析完毕。

  执行代码:逐行执行代码,执行第9行;去寻找“仓库”里的a;只有a=function(){}此时第9行执行结果是整个函数体;执行第10行;此时等号后面的1会赋值给仓库里a;此时a=1;“仓库”里只有a=1;执行第11行,得出结果1;第12行函数没有调用故不执行;执行第13行,仓库里还是只有a=1;故得出结果1。

   片段三:

 

    对于片段三执行结果如下

   预解析:寻找关键字;第9行找了var;此时a=undefined;第10行找到了函数f1;此时f1=function f1(){alert(a);var a=2;}这个函数体;此时“仓库”里有a=undefined和f1=function f1(){alert(a);var a=2;};预解析完毕;

   执行代码:执行第9行,把外仓库里的a赋值为1;此时a=1;继续执行遇到函数没有调用直接执行第14行;第14行函数调用;开始执行函数;在函数执行前同样经过两个过程;(1.预解析;2.执行函数里的代码;) 预解析:函数没有传入参数;函数体内只寻找到var关键字,于是a=undefined;函数体内“仓库”此时只有a=undefined;执行第11行;弹出undefined;执行第12行;改变“仓库”里a的值,此时a=2;当然是属于函数的体内的a=2;与函数外“仓库”存的a=1无关;

函数执行完后,跳出函数继续执行第15行;此时在全局作用域的“仓库”里只有a=1;故会弹出1;执行完毕。

   片段四:


    对于片段四执行结果如下;

   预解析:寻找关键字:第9行找到了var;此时给a=undefined;第10行找到了函数f1;此时f1=function f1(){alert(a);a=2;}。此时“仓库”里有a=undefined和f1=function f1(){alert(a);a=2;};预解析完毕;

   执行代码:执行第9行,把外仓库里的a赋值为1;此时a=1;继续执行,遇到函数没有调用直接执行第14行;第14行函数调用;开始执行函数;函数执行前同样经过两个过程;(1.预解析;2.执行函数里的代码;)预解析:没有找到关键字,预解析完毕;执行函数体内代码:执行11行;没有在函数内“仓库”中找到a,于是会顺着作用域链向外寻找,在函数外的“仓库”中找到了a=1;故弹出1;执行第12行;12行是全局变量,会修改函数外“仓库”的值;此时外“仓库”的值改为a=2;函数执行完,跳出函数继续执行第15行,外“仓库”找到了a=2;故弹出2;

   片段五:


  对于片段五执行结果如下:

   预解析:寻找关键字;第9行找到了var;此时a=undefined;第10行找到了函数f1;此时f1=function f1(a){alert(a);a=2;}。此时“仓库”里有a=undefined和f1=function f1(a){alert(a);a=2;};预解析完毕;

   执行代码:执行第9行,把外仓库里的a赋值为1,此时a=1;继续执行;函数未调用,执行第14行;第14行函数调用;开始执行函数;(1.预解析;2.执行函数里的代码;)预解析:找到了函数的参数a;此时a=undefined;执行第11行,调用时未传入参数,故弹出undefined;执行第12行;修改了函数内“仓库”里a的值;此时a=2;函数外的a还是等于1;函数执行完,跳出函数;执行第15行,外“仓库”里有a=1;弹出1;

  片段六


对于片段六的执行结果如下:

    预解析:寻找关键字;第9行找到了var;此时a=undefined;第10行找到了函数f1;此时f1=function f1(a){alert(a);a=2;}。此时外“仓库”里有a=undefined和f1=function f1(a){alert(a);a=2;};预解析完毕;

    执行代码:执行第9行;把外仓库里的a赋值为1,此时a=1;继续执行;函数未调用,执行第14行;第14行函数调用;开始执行函数(1.预解析;2.执行函数里的代码;)预解析:找到了函数的参数a;此时a=undefined;开始执行函数;调用时传入了参数,修改函数内“仓库”值;故a=1;执行第11行,弹出1;执行第12行修改函数内“仓库”里a的值,a=2;函数执行完毕,跳出函数;执行第15行;外“仓库”里只有a=1;故弹出1;



 以上便是我遇到了一些预解析的问题,开始搞得我晕头转向;后来慢慢找到了规律,具体情况具体分析;欢迎补充,一起进步。





1 0
原创粉丝点击