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 相关文章推荐
json 实例详细说明教程
Oct 31 Javascript
js原型链原理看图说明
Jul 07 Javascript
有关于eclipse配置spket需要注意的一些地方
Apr 07 Javascript
js 鼠标移动显示图片的简单实例
Dec 25 Javascript
简单的js图片轮换代码(js图片轮播)
May 06 Javascript
Bootstrap开发实战之响应式轮播图
Jun 02 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
Aug 24 Javascript
JavaScript面试题(指针、帽子和女朋友)
Nov 23 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
Feb 14 Javascript
javascript获取以及设置光标位置
Feb 16 Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
Dec 11 Javascript
js实现计算器功能
Aug 10 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
获得Google PR值的PHP代码
2007/01/28 PHP
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
PHP 遍历XP文件夹下所有文件
2008/11/27 PHP
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
浅析51个PHP处理字符串的函数
2013/08/02 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
详细讲解JS节点知识
2010/01/31 Javascript
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
详解JS数值Number类型
2018/02/07 Javascript
详解vue服务端渲染浏览器端缓存(keep-alive)
2018/10/12 Javascript
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
linux环境下Django的安装配置详解
2019/07/22 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
销售自荐信
2013/10/22 职场文书
村委会主任先进事迹
2014/01/15 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
检讨书1000字
2014/10/11 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
假如给我三天光明读书笔记
2015/06/26 职场文书
清明扫墓感想
2015/08/11 职场文书