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


Posted in Javascript onAugust 03, 2020

       JavaScript是一种描述型脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言,而是由浏览器进行动态地解析与执行。如果你不能理解javaScript语言的运行机制,或者简单地说,你不能掌握javascript的执行顺序,那你就犹如伯乐驾驭不了千里马,让千里马脱缰而出,四处乱窜。

       那么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的,而代码一中的变量是完全不存在的,所以浏览器报错。

            理解了上面的几个术语,相信大家对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 οnlοad="Fn()">
  
</body>
<script type="text/javascript">
  alert("second");
</script>

到此这篇关于javascript运行机制之执行顺序理解的文章就介绍到这了,更多相关javascript运行机制之执行顺序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
Mar 30 Javascript
js关闭子窗体刷新父窗体实现方法
Dec 04 Javascript
js随机生成字母数字组合的字符串 随机动画数字
Sep 02 Javascript
详解基于webpack搭建react运行环境
Jun 01 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
Jun 04 Javascript
Vue仿手机qq的实例代码(demo)
Sep 08 Javascript
VUE实现一个分页组件的示例
Sep 13 Javascript
AngularJS集合数据遍历显示的实例
Dec 27 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
Mar 06 Javascript
JS实现获取word文档内容并输出显示到html页面示例
Jun 23 Javascript
通过jQuery学习js类型判断的技巧
May 27 jQuery
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
Aug 10 Javascript
解决vue+elementui项目打包后样式变化问题
Aug 03 #Javascript
vue实现PC端分辨率适配操作
Aug 03 #Javascript
浅谈JavaScript中的“!!”作用
Aug 03 #Javascript
基于脚手架创建Vue项目实现步骤详解
Aug 03 #Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
Aug 03 #Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
Aug 03 #Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
Aug 03 #Javascript
You might like
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
JavaScript轻松创建级联函数的方法示例
2017/02/10 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
Python  连接字符串(join %)
2008/09/06 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
2017/06/07 Python
高质量Python代码编写的5个优化技巧
2017/11/16 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
英国第一的购买便宜玩具和游戏的在线购物网站:Bargain Max
2018/01/24 全球购物
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
Weblogc domain问题
2014/01/27 面试题
介绍一下Linux中的链接
2016/06/05 面试题
Ajax的工作原理
2015/12/04 面试题
应届生财务管理求职信
2013/11/06 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
合同和协议有什么区别?
2014/10/08 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
Python基础之Socket通信原理
2021/04/22 Python
Python常遇到的错误和异常
2021/11/02 Python
用JS写一个发布订阅模式
2021/11/07 Javascript
MySQL中order by的执行过程
2022/06/05 MySQL