javascript的解析执行顺序

1、代码块

JavaScript中的代码块是指由<script>标签分割的代码段。例如:

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

  

   JS是按照代码块来进行编译和执行的,代码块间相互独立,但变量和方法共享。什么意思呢? 举个例子,你就明白了:

 <script type="text/javascript">
       alert(str);//因为没有定义str,所以浏览器会出错,下面的不能运行
       alert("我是代码块一");//没有运行到这里
       var test = "我是代码块一变量";
 </script>
 <script type="text/javascript">
       alert("我是代码块二"); //这里有运行到
       alert(test); //弹出"我是代码块一变量"
 </script>

  

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

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

JS中的函数定义分为两种:声明式函数与赋值式函数。

 <script type="text/javascript">
      function Fn(){ //声明式函数

      }

      var Fn = function{  //赋值式函数

      }
 </script>

  

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

3、预编译期与执行期

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

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

 <script type="text/javascript">
      Fn();  //执行结果:"执行了函数2",同名函数后者会覆盖前者
      function Fn(){ //函数1
         alert("执行了函数1");
      }

      function Fn(){  //函数2
         alert("执行了函数2");
      }
 </script>

 


 <script type="text/javascript">
       Fn();  //执行结果:"执行了声明式函数",在预编译期声明函数及被处理了,所以即使Fn()调用函数放在声明函数前也能执行。
       function Fn(){ //声明式函数
          alert("执行了声明式函数");
       }

       var Fn = function(){  //赋值式函数
          alert("执行了赋值式函数");
       }
 </script>

 //代码块一
 <script type="text/javascript">
       alert(str);//浏览器报错,但并没有弹出信息窗
</script>
 //代码块二
 <script type="text/javascript">
       alert(str); //弹窗"undefined"
       var str = "aaa";
 </script>

  

 

- //js在预处理期对变量进行了声明处理,但是并没有进行初始化与赋值,所以导致代码块二中的变量是unfiened的,而代码一中的变量是完全不存在<span style="font-family: Arial, Helvetica, sans-serif;">的,所以浏览器报错。</span>

理解了上面的几个术语,相信大家对JS的运行机制已经有了个大概的印象了,现在我们来看个例子:

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

  

为什么运行上面的代码浏览器会报错呢?声明函数不是会在预处理期就会被处理了吗,怎么还会找不到Fn()函数呢?其实这是一个理解误点,我们上面说了JS引擎是按照代码块来顺序执行的,其实完整的说应该是按照代码块来进行预处理和执行的,也就是说预处理的只是执行到的代码块的声明函数和变量,而对于还未加载的代码块,是没法进行预处理的,这也是边编译边处理的核心所在。

现在,让我们来总结整理下:

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

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

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

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

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

step6. 结束。

而根据HTML文档流的执行顺序,需要在页面元素渲染前执行的js代码应该放在<body>前面的<script>代码块中,而需要在页面元素加载完后的js放在</body>元素后面,body标签的onload事件是在最后执行的。

 <script type="text/javascript">
     alert("first");
     function Fn(){
         alert("third");
     }
 </script>
 <body >

 </body>
 <script type="text/javascript">
     alert("second");
 </script>

  

时间: 2024-08-25 15:38:37

javascript的解析执行顺序的相关文章

Javascript加载执行顺序

本文主要内容 一.不同位置的script标签执行顺序 二.document.ready和window.onload的区别 一.不同位置的script标签执行顺序 整个加载的过程从解析头部开始,比如html编码格式,meta标签等.当浏览器加载html文件并解析到<head>时,页面也就是<body>并没有被解析,浏览器会等到<head>中的js执行完再加载页面. 比如直接在head的script标签里面写$('#AD').css("display",

JavaScript执行顺序详细介绍

JavaScript执行顺序详细介绍 作者: 字体:[增加 减小] 类型:转载 时间:2013-12-04我要评论 这篇文章主要介绍了JavaScript执行顺序,有需要的朋友可以参考一下 之前从JavaScript引擎的解析机制来探索JavaScript的工作原理,下面我们以更形象的示例来说明JavaScript代码在页面中的执行顺序.如果说,JavaScript引擎的工作机制比较深奥是因为它属于底层行为,那么JavaScript代码执行顺序就比较形象了,因为我们可以直观感觉到这种执行顺序,当

JavaScript执行顺序详解

这篇文章主要介绍了JavaScript执行顺序,有需要的朋友可以参考一下 之前从JavaScript引擎的解析机制来探索JavaScript的工作原理,下面我们以更形象的示例来说明JavaScript代码在页面中的执行顺序.如果说,JavaScript引擎的工作机制比较深奥是因为它属于底层行为,那么JavaScript代码执行顺序就比较形象了,因为我们可以直观感觉到这种执行顺序,当然JavaScript代码的执行顺序是比较复杂的,所以在深入JavaScript语言之前也有必要对其进行剖析.1.1

浏览器环境下JavaScript脚本加载与执行探析之代码执行顺序

本文主要基于向HTML页面引入JavaScript的几种方式,分析HTML中JavaScript脚本的执行顺序问题 1. 关于JavaScript脚本执行的阻塞性 JavaScript在浏览器中被解析和执行时具有阻塞的特性,也就是说,当JavaScript代码执行时,页面的解析.渲染以及其他资源的下载都要停下来等待脚本执行完毕①.这一点是没有争议的,并且在所有浏览器中的行为都是一致的,原因也不难理解:浏览器需要一个稳定的DOM结构,而JavaScript可能会修改DOM(改变DOM结构或修改某个

&lt;script&gt;标签的加载解析执行

转自原文 <script>标签的加载解析执行 看了很多网上的文章,都是大同小异.总结一下.内部原理还没有搞清楚,有机会再学习. 一.<script>标签的加载解析执行顺序 html页面中的<script>标签中的内容(直接写入或者引用外部文件都一样)是以顺序加载执行的,每个<script>标记内容可以当成一个独立的块,同步的情况下一个块加载解析然后执行完后才加载下一块.当然这时也会阻塞其他页面元素的加载.所以网上说的变量调用: <script type

javaScript代码执行顺序

javaScript是一种描述型脚本语言,由浏览器进行动态的解析和执行. 页面加载过程中,浏览器会对页面上载入的每个js代码块进行扫描. JavaScript是一段一段的分析执行的,在分析执行同一段代码中,定义式函数会 被提取出来优先执行.函数定义执行完毕后,才会按顺序执行其他代码. 一.代码块 JavaScript代码块是由一对script开始标签和结束标签包裹的一段代码. JavaScript是按照代码块来进行编译和执行的,代码块之间相互独立,但是前面执行的变量和方法,后面的代码块可以使用.

javascript的解析顺序和变量作用域

一.变量的作用域 1.全局变量 在代码中任何地方都能够访问得到的变量,拥有全局的作用域. A.最外层函数外面定义的变量. B.没有定义直接赋值的变量,拥有全局属性. 2.局部变量 只能在固定的代码片段(函数片段中)中访问得到. A.函数内部定义的变量,就是局部变量. B.参数也是局部变量. 二.javascript预解析顺序 一.<Script></script>块依次解析. 二.解析代码运行的环境. 三.对标识符(关键字)(var function )进行解析,解析到相应的环境下

javascript执行顺序小结

作为web开发人员,一定要对js的执行顺序,解析原理有一定了解,否则无法掌控这门小巧好用的语言 javascript是一门实现网页动态效果的语言,也是主要负责和服务端的交互,他抛弃了像java中类的束缚,将数据结构简化,利用typeof运算符得到的只有number,string,boolean,underfined,null,function,object,回归简单,接下来就说一下js的执行顺序 js是按块(代码块)执行的 1>.浏览器在解析html时会解析js,就像是先把js下载到浏览器内存中

javascript运行机制之执行顺序详解

JavaScript是怎么来进行解析的吗?它的执行顺序又是如何的呢?在了解这些之前,我们先来认识几个重要的术语: 1.代码块 JavaScript中的代码块是指由<script>标签分割的代码段.例如: <script type="text/javascript"> alert("这是代码块一"); </script> <script type="text/javascript"> alert(&q