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 相关文章推荐
Blocksit插件实现瀑布流数据无限( 异步)加载
Jun 20 Javascript
JS判断当前页面是否在微信浏览器打开的方法
Dec 08 Javascript
JavaScript实现点击按钮直接打印
Jan 06 Javascript
jQuery实现的自适应焦点图效果完整实例
Aug 24 Javascript
AngularJS删除路由中的#符号的方法
Sep 20 Javascript
JavaScript中关于iframe滚动条的去除和保留
Nov 17 Javascript
JS正则替换去空格的方法
Mar 24 Javascript
实例详解Node.js 函数
Jun 10 Javascript
详解如何为你的angular app构建一个第三方库
Dec 07 Javascript
js实现选项卡效果
Mar 07 Javascript
基于JS实现操作成功之后自动跳转页面
Sep 25 Javascript
vuex Module将 store 分割成模块的操作
Dec 07 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部分常见问题总结
2008/03/27 PHP
一个典型的PHP分页实例代码分享
2011/07/28 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
2011/11/02 PHP
php模拟登陆的实现方法分析
2015/01/09 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
2016/11/21 PHP
PHP查询分页的实现代码
2017/06/09 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
学习javascript的闭包,原型,和匿名函数之旅
2015/10/18 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
详解Vue用cmd创建项目
2019/02/12 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
Python操作Excel之xlsx文件
2017/03/24 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
Python图像读写方法对比
2020/11/16 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
汇科协同Java笔试题
2012/03/31 面试题
医院护理人员的自我评价分享
2013/10/04 职场文书
生产部统计员岗位职责
2014/01/05 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
文秘求职信范文
2014/04/10 职场文书
涉外离婚协议书怎么写
2014/11/20 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书