JavaScript代码执行的先后顺序问题
作者:我吃小月饼 发布时间:2024-04-29 13:45:54
一、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代码执行的先后顺序问题,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
来源:http://www.cnblogs.com/interesting-me/p/7745952.html


猜你喜欢
- 一、前言前文是针对普通的字符串数据进行处理。今天,我们要讲解的textwrap库,是对多文本进行处理的库。比如对于段落的缩进,填充,截取等,
- 1. fixture的声明我们使用@pytest.fixture()来声明fixture函数。fixture()即可无参数进行声明,也可以带
- MSDN:包含正在 SQL Server 实例上运行的进程的相关信息。这些进程可以是客户端进程或系统进程。 视图中主要的字段: 1. Spi
- 语法:CREATE TRIGGER trigger_name trigger_time trigger_eventON tbl_name F
- 进入主题1.import turtle as timport matht.pensize(3)t.tracer(10)t.hideturtl
- 描述filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。该接收
- 前言本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧。主要工具scrapyBeau
- vscode 的调试功能其实提供了一键编译运行的功能(ctrl+F5),但是启动特别特别慢… 又不想安装插件,后来发现vscode 提供了一
- 用python做大型工程时,经常会出现import问题。比如,当你import另一个py文件时,这个py不存在于你的运行路径下,便会报错。大
- 第一:编写限制搜索范围的查询语句。众所周知,在数据库查询的时候返回记录的多少直接关系到查询的效率。所以,在客户端通过一定的条件语句,限制搜索
- 大家先看一下Python os模块中的部分函数python 路径相关的函数 os.listdir(dirname):列出dirname下的目
- 我目标文件夹下有一大批图片,我要把它转变为指定尺寸大小的图片,用pthon和opencv实现的。以上为原图片。import cv2impor
- 在phpcms\modules\wap\index.php里面,搜索下面这句if(!$r || $r['status'] !
- 在对列表的元素进行找寻时,会频繁的说到遍历的理念。对于复杂的遍历要求,如多个列表中查找就显然不适合用for循环。本篇所要带来的是zip()
- 首先新建一个dataframe:In[8]: df = pd.DataFrame({'name':list('ABC
- 在安装MySQL时遇到几个问题,网上查找的答案大同小异,并没有很好的解决我的问题,完成之余记录下来方便以后查看。1.官网下载8.0.16版本
- String slctpsql="select id ,"+uid+","+ddd+",&
- mysql数据库里,对一个已创建的表进行DDL操作,比如说添加一个字段。在做测试时,发现ddl操作的时间特别的长。
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 12 - Drag and Drop using
- var YX = { //得到JS内置数据类型的类型,返回值包括[Date,RegExp,Number,String,Array,Boole