认识javascript的引擎之--1

前言:

一:每一款浏览器里面都能执行js脚本,那是因为制造商在浏览器里面加入了js引擎。也就是说js引擎在浏览器里面占有一席之地。

    1.开始的时候js处于沉睡状态,直到运行页面遇到 <script> 这个标签的时候就被浏览器叫醒了:浏览器说,js引擎有个叫<script> 的叫你

    2.然后js引擎就出去招待客人 <script>。到这个时候js引擎就开始工作了。

二:浅谈js引擎的工作

       1.预解析

      js引擎工作的时候回预先往自己的一个仓库里面存数据,然后在进行读代码的工作。

      js引擎会读取  var  function  参数...    在遇见这个声明的时候,js引擎就会把这些存储在自己的仓库里面。

      遇到所有的变量,在正式运行代码之前,都提前赋了一个值:未定义    a =  .....   //undefined   未定义

      所有的函数,在正式运行代码之前,都是整个函数块:fn1 = function fn1(){ alert(2); }

      遇到重名的:只留一个   

        1.变量和函数重名了,就只留下函数。  因为变量为未定义( undefine)函数有值,所以保留有值的。
        2.函数与函数,后出现的函数会覆盖前出现的函数。

     2.读代码(逐行读取从上到下)

      当预解析完毕就开始读取代码:读取代码的时候遇到变量的 表达式:= + - * / % ++ -- ! 参数……      表达式可以修改预解析的值!  就会到自己的仓库里面查看是否有这个变量,并修改其仓库里面的变量值。

三点:面试题问答

 1 alert(a);                    // function a (){ alert(4); }
 2 var a = 1;
 3 alert(a);                    // 1
 4 function a (){ alert(2); }
 5 alert(a);                    // 1
 6 var a = 3;        
 7 alert(a);                    // 3
 8 function a (){ alert(4); }
 9 alert(a);                    // 3
10 
11 js引擎如何执行呢?
12       1.预解析:解析 变量,function 参数等   放入自己的仓库存起来
13           解析到第2行: a =...
14           解析到第4行: a = function(){alert(2)}   这时候遇到同名的只保留一个,保留函数
15           解析到第6行: 仓库里面依旧是   a = function(){alert(2)} 
16           解析到第8行: 仓库里面  a = function(){alert(4)}    他会覆盖第5行的a 
17           解析完毕:仓库里面剩下  a = function(){alert(4)}
18     2.读取操作(读取的时候逐行读取)
19         读取到第1行:先查看仓库里面有什么,仓库里面只剩下 function(){alert(4)}   输出: function(){alert(4)}
20         读取到第2行:这是一行表达式,表达式会修改仓库里面的值  仓库里面 a = 1
21         读取到第3行:输出  1
22         读取到第4行: 只是一个函数的声明,不是表达式所以仓库里面还是 a = 1 
23         读取到第5行:输出1
24         读取到第6行:仓库里面 a=3
25         读取到第7行:输出 3
26         读取到第8行:只是一个函数的声明,不是表达式所以仓库里面还是 a = 3    
27         读取到第9行:输出 3
原文地址:https://www.cnblogs.com/andyhxl/p/5987448.html