JavaScript代码执行的先后顺序问题


Posted in Javascript onOctober 29, 2017

一、js--->单线程

 

严格意义上来说,javascript没有多线程的概念,所有的程序都是单线程依次执行的。

  1、什么是单线程?

通俗点说,就是代码在执行过程中,另一段代码想要执行就必须等当前代码执行完成后才可以进行。我们拿一段代码来解释一下吧

for(var i=1;i<=3;i++){
   setTimeout(function(){
     console.log(i); //输出:4,4,4
   },0)
 }

我们来看一下上面的这段代码,既然延时器时间设置为0,那么应该执行一遍循环就应该立即打印出一个i,但是最终的打印结果为:4,4,4。之所以会出现上面的结果,正是因为js代码是单线程应用。

在执行过程中,先遇到for循环,for循环先进入线程。当i=1时,循环走到setTimeOut后,此时的for循环还没有执行完成,setTimeOut就会被放入一个地方(线程池)等待执行。此时for循环继续执行,当i=2时,for循环仍没有执行完,这时的setTimeOut仍会被放在线程池中等待执行……依次类推,直到for循环转完3遍后,for循环执行完了,此时线程空闲了,在线程池中等待执行的setTimeOut依次执行打印i,而for循环执行完成后,i变成了4,所以打印出了三个4。

2、如果想要改变上面的状况可以运用以下代码

//将var变为let
for(let i=1; i<=3; i++){
  setTimeOut(function(){
    console.log(i); //输出的结果为1,2,3
  },0);
}
//用自执行函数进行包裹
for(var i=1; i<=3; i++){
  !function(i){
    setTimeOut(function(){
      console.log(i); //输出的结果为1,2,3
    },0);
  }(i)
}

二、js中的函数作用域和代码的执行

>>>函数作用域

我们先来了解一下以下几个概念:

1、在js语言中,没有类似于c语言这样的块级作用域。

2、js语言中的顶级作用域为window对象范围内,称为全局作用域,在全局作用域中声明的变量为全局变量。

3、js函数范围内的变量只能在函数内部使用,函数外部无法使用,这样的变量为局部变量。

4、js函数可以嵌套,多个函数的嵌套构成了作用域的层层嵌套,这称为js中的作用域链。

5、js作用域链变量访问规则:

(1)、当前作用域内存在要访问的变量时,则使用当前作用域中的变量。

 

    (2)、当前作用域中不存在要访问的变量时,则会到上一层作用域中寻找,直到全局作用域。

>>>执行顺序

 

js代码执行分为两个部分:

1、代码的检查装载阶段(预编译阶段),此阶段进行变量和函数的声明,但是不对变量进行赋值,变量的默认值为undefined。

2、代码的执行阶段,此阶段对变量进行赋值和函数的声明。

看了上面的一些具体的概念,我们拿一段代码进行举例说明:

var a=1; //声明了一个全局变量
function func(){
  console.log(a); //输出:undefined。打印a,而在func这个作用域中已经声明了a变量,按照js的执行顺序,此时的a并未被赋值。
  var a=1;
  console.log(a); //输出:1。
}
func();

看上面的代码:第一个a输出undefined。原因:js作用域链的访问规则,当前作用域内存在要访问的变量a,所以使用当前作用域中的变量。再根据js代码的执行顺序,此时的a只是声明了而并未被赋值,默认为undefined,所以输出undefined。

而第二个a,输出1,正是因为此时的a已经被声明且被赋值,所以a输出1。

总结

以上所述是小编给大家介绍的JavaScript代码执行的先后顺序问题,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
将CKfinder整合进CKEditor3.0的新方法
Jan 10 Javascript
js 获取元素下面所有li的两种方法
Apr 14 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
Jan 27 Javascript
BootStrap selectpicker
Jun 20 Javascript
利用Angularjs和bootstrap实现购物车功能
Aug 31 Javascript
动态加载css方法实现和深入解析
Jan 18 Javascript
微信小程序movable view移动图片和双指缩放实例代码
Aug 08 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
Aug 23 jQuery
vue axios 二次封装的示例代码
Dec 08 Javascript
微信小程序自定义底部弹出框
Nov 16 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
Mar 03 Javascript
Vue实现跑马灯样式文字横向滚动
Nov 23 Vue.js
springmvc接收jquery提交的数组数据代码分享
Oct 28 #jQuery
ES6中Class类的静态方法实例小结
Oct 28 #Javascript
jQuery实现的简单前端搜索功能示例
Oct 28 #jQuery
jQuery实现点击下拉框中的值累加到文本框中的方法示例
Oct 28 #jQuery
jquery ajax异步提交表单数据的方法
Oct 27 #jQuery
mint-ui的search组件在键盘显示搜索按钮的实现方法
Oct 27 #Javascript
基于BootStrap的文本编辑器组件Summernote
Oct 27 #Javascript
You might like
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
浅谈jQuery 选择器和dom操作
2016/06/07 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
极简的Python入门指引
2015/04/01 Python
基于python实现在excel中读取与生成随机数写入excel中
2018/01/04 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
Jupyter加载文件的实现方法
2020/04/14 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
专业毕业生个性的自我评价
2013/10/03 职场文书
怎样写好自我评价呢?
2014/02/16 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
2014年客服工作总结与计划
2014/12/09 职场文书
颐和园导游词
2015/01/30 职场文书
2015年学生会部门工作总结
2015/04/21 职场文书
springboot集成redis存对象乱码的问题及解决
2022/06/16 Java/Android
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers