引言:

  javascript是一种解释型的脚本语言,它不同于java或者c#这种编译语言,不需要编译成游览器可识别的语言,而是由游览器动态解析和执行的。(本身就是游览器可以直接识别,javascript的解释器被称为javascript引擎,是游览器默认的一部分)

   要理解javascript的解析过程,先了解几个概念。

1.代码块

  javascript中的代码块是指由<script>标签分割的代码段。

  <script type="text/javascript">
console.log("这是代码块一");
  </script>   <script type="text/javascript">
console.log("这是代码块二");
  </script>

  JS是按照代码块来进行编译和执行的,代码块间相互独立,但变量和方法共享。

<script type="text/javascript">
console.log(str);        //因为没有定义str,所以浏览器会出错,下面的不能运行
console.log("我是代码块一");   //没有运行到这里
var test = "我是代码块一变量";
</script> <script type="text/javascript">
console.log("我是代码块二"); //这里有运行到
console.log(test);      //输出undefined,因为第一个代码块执行第一行代码的时候游览器报错,代码块中第一行下面的所有代码都没有执行。故test的定义了,但没有赋值。(为什么test定义了却没有赋值,因为变量申明的提升)
</script>

  上面的代码中代码块一中运行报错,但不影响代码块二的执行,这就是代码块间的独立性,而代码块二中能调用到代码一中的变量,则是块间共享性

2.声明式函数与赋值式函数

<script type="text/javascript">
function Fn(){ //声明式函数
     console.log('我是声明式函数');
}
var Fn = function{ //赋值式函数
  console.log('我是赋值式函数');
}
</script>

  声明式函数与赋值式函数的区别在于:在JS的预编译期,声明式函数将会先被提取出来,然后才按顺序执行js代码。

预编译期与执行期:

  事实上,JS的解析过程分为两个阶段:预编译期(预处理)与执行期。

  预编译期JS会对本代码块中的所有声明的变量和函数进行处理,但需要注意的是此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值。

  

<script type="text/javascript">
Fn(); //执行结果:"执行了函数2",同名函数后者会覆盖前者
function Fn(){   //函数1
console.log("执行了函数1");
}
function Fn(){     //函数2
console.log("执行了函数2");
}
</script>
<script type="text/javascript">
Fn(); //执行结果:"执行了声明式函数",在预编译期声明函数及被处理了,所以即使Fn()调用函数放在声明函数前也能执行。
function Fn(){ //声明式函数
      console.log("执行了声明式函数");
}
var Fn = function(){ //赋值式函数
      console.log("执行了赋值式函数");
    }
</script>
//代码块一
<script type="text/javascript">
console.log(str);//浏览器报错,但并没有输出信息
</script> //代码块二
<script type="text/javascript">
console.log(str);//控制台输出"undefined"
var str = "aaa";
</script> //js在预处理期对变量进行了声明处理,但是并没有进行初始化与赋值,所以导致代码块二中的变量是unfiened的,而代码一中的变量是完全不存在的,所以浏览器报错。

  我们来看看下面这个例子

<script type="text/javascript">
Fn(); //浏览器报错:"undefined"
</script> <script type="text/javascript">
function Fn(){ //函数1
console.log("执行了函数1");
}
</script>

  ????

  因为javascript的引擎是按照代码块来进行预处理和执行的,也就是说预处理的只是执行到的代码块的声明函数和变量,而对于还未加载的代码块,是没法进行预处理的,这也是边编译边处理的核心所在。

总结:

  step 1. 读入第一个代码块。

  step 2. 做语法分析,有错则报语法错误(比如括号不匹配等)并跳转到step5,没错跳转step3。

  step 3. 对var变量和function定义做“预编译处理”(永远不会报错的,因为只解析正确的声明)。

  step 4. 执行代码段,有错则报错(比如变量未定义)。

  step 5. 如果还有下一个代码段,则读入下一个代码段,重复step2。

  step 6. 结束。

  

  

javascript的解析过程的更多相关文章

  1. JavaScript(2)——网页解析过程

    JavaScript 网页解析过程 前端编程工具:Visual Studio Code 快捷语法:Emmett语法 正题: 当我们在浏览器输入网址的时候,从服务器下载网页:这个文字经过HTML解析器的 ...

  2. JavaScript预解析

    定义:JavaScript"预解析",可以理解为把变量或函数预先解析到它们被使用的环境中. 通俗点讲,即认为浏览器在正式运行JavaScript代码前, 第一步,会预先根据关键字v ...

  3. javascript预解析和作用域

    JavaScript解析过程分为两个阶段: 一是:编译阶段.就是JavaScrip预解析阶段,在这个阶段JavaScript解析器将完成把JavaScript脚本代码转换到字节码; 二是:执行阶段.在 ...

  4. Javascript预解析、作用域、作用域链

    最近在看js的一些资料,总结一下昨晚看到的js作用域方面的知识,不准确的地方希望留言指正! 先看片段js代码如下: < script type="text/javascript&quo ...

  5. JavaScript URL传值过程中遇到的问题及知识点总结

    JavaScript URL传值过程中遇到的问题及知识点总结 Web系统开发过程中经常用到URL进行传值,刚刚接触时不太会解析,会出现中文乱码问题等. 1.父子页面之间的传值(在一个页面中以加载ifr ...

  6. 分析Json/Xml的解析过程

    json和xml都是用来进行数据的传输和交换的,是目前用来传输数据用的最多的两种技术,下面我们分别来认识一下它们及其解析过程 一.json 1.json简介 JSON是一种基于文本的轻量级数据交换格式 ...

  7. javascript的解析顺序

    一.javascript的解析顺序 我们大家所理解的代码的执行顺序都是从上到下的,但是实际上确不是这样的.我们看一下下面的代码. 1 alert(a);2 var a = 1;如果执行顺序是从上到下的 ...

  8. Javascript的执行过程详细研究

    下面我们以更形象的示例来说明JavaScript代码在页面中的执行顺序.如果说,JavaScript引擎的工作机制比较深奥是因为它属于底层行为,那么JavaScript代码执行顺序就比较形象了,因为我 ...

  9. 游览器中javascript的执行过程

    在讲这个问题之前,先来补充几个知识点,如果对此已经比较了解可以直接跳过 大多数游览器的组件构成如图 在最底层的三个组件分别是网络,UI后端和js解释器.作用如下: (1)网络- 用来完成网络调用,例如 ...

随机推荐

  1. bootstrap源码学习与示例:bootstrap-tab

    http://www.cnblogs.com/rubylouvre/archive/2012/12/22/2829176.html  bootstrap源码学习与示例 https://www.w3sc ...

  2. 1px 下划线solid的问题

    1 物理像素线,也就是普通屏幕下 1px,高清屏幕下 0.5px的情况,采用transform属性 scale 实现即可. .mod_grid { position: relative; &: ...

  3. UNIX网络编程卷1 时间获取程序client UDP 协议无关

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie /** * UDP.协议无关,调用 getaddrinfo 和 udp_client **/ ...

  4. nyoj 740 “炫舞家“ST

    “炫舞家“ST 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 ST是一个酷爱炫舞的玩家.TA很喜欢玩QQ炫舞,因此TA也爱屋及乌的喜欢玩跳舞机(Dance Dance ...

  5. vim编码设置

    转载于:http://www.cnblogs.com/freewater/archive/2011/08/26/2154602.html vim 编码方式的设置和所有的流行文本编辑器一样,Vim 可以 ...

  6. SQLServer 与 MySQL

    SQL Server         MySQL1.getdate()            NOW()        2.top 100                               ...

  7. 27. Retrofit2 -- How to Use Dynamic Urls for Requests

    27. Retrofit2 -- How to Use Dynamic Urls for Requests Retrofit tutorial 用户案例场景 如何使用动态 Url 相对于基本地址,动态 ...

  8. How to add total page to Odoo Report(7.0 version)

    add this codes to your rml file: <drawRightString x="19.5cm" y="0.3cm">Pag ...

  9. 6:7 题一起MySQL数据库分库备份

    企业Shell面试题6:MySQL数据库分表备份 请实现对MySQL数据库进行分表备份,用脚本实现. 解答: [root@db01 scripts]# cat fenbiao.sh #!/bin/ba ...

  10. node.js和前端js有什么区别

    进行前端开发工作需要掌握技能有html. css.js以及各种前端框架,把这些技术玩6就可以成为一名合格的前端开发工作者 而进行nodejs开发,需要掌握js.web服务器原理.关系数据使用, 如果玩 ...