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 相关文章推荐
JavaScript高级程序设计 读书笔记之八 Function类及闭包
Feb 27 Javascript
Javascript实现滚动图片新闻的实例代码
Nov 27 Javascript
js实现checkbox全选、不选与反选的方法
Feb 09 Javascript
深入浅析Extjs中store分组功能的使用方法
Apr 20 Javascript
详细分析Javascript中创建对象的四种方式
Aug 17 Javascript
AngularJS动态绑定HTML的方法分析
Nov 07 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
Nov 18 Javascript
详解Puppeteer 入门教程
May 09 Javascript
Bootstrap4 gulp 配置详解
Jan 06 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
Jun 26 Javascript
Vue可自定义tab组件用法实例
Oct 24 Javascript
ant-design表单处理和常用方法及自定义验证操作
Oct 27 Javascript
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 危险函数全解析
2009/09/09 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
php文件上传类完整实例
2016/05/14 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
2015/05/12 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
smartupload实现文件上传时获取表单数据(推荐)
2016/12/12 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
2017/09/19 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
JavaScript创建对象的四种常用模式实例分析
2019/01/11 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
[51:28]EG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/16 DOTA
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
Python通过调用mysql存储过程实现更新数据功能示例
2018/04/03 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
Python3简单实现串口通信的方法
2019/06/12 Python
Python中调用其他程序的方式详解
2019/08/06 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
医院营销工作计划
2015/01/16 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
比较几种Redis集群方案
2021/06/21 Redis