javascript执行顺序
2015-08-14 15:59
483 查看
在网上搜索javascript执行顺序,很多人直接简单粗暴地告诉你,javascript是按照从上到下的顺序执行的,作为一个对于javascript了解不深的人,觉得非常有道理,平时的使用中貌似也就是这样从上往下执行的。大神建议看一下"setTimeout(function(){},0);",看一下执行的顺序,于是test以下代码:
结果是这样的:
1
2
setTimeout
那么问题来了,既然定时器时间是0ms,不是应该没有延迟,按顺序执行吗,为什么会这样呢?
这时候就要提到javascript的单线程机制了。javascript为什么是单线程而不是多线程呢,因为javascript是可以操作dom元素的,如果这里有两个事件,一个要增加dom元素,一个要删除dom元素,如果是多线程进行,那么无法确定哪一个事件先执行完毕,哪一个后执行完毕,这样会造成混乱,所以单线程。javascript的单线程机制的工作流程是这样的,每个任务到来之后,在前面的任务没有执行完之前,只能放在队列的末尾等待。console.log('0')执行之后,本来应该按顺序执行setTimeout线程,但是,setTimeout线程实际上是一个异步线程,因为它不是依靠javascript引擎来计时的,因为一旦javascript引擎的线程阻塞,计时就无法进行,因为浏览器是多线程的,所以这里实际上是在浏览器中新开一个线程进行计时,时间到了之后,再把任务返回给javascript引擎进行处理,而javascript引擎在空闲时会插入下一个任务,计时器移交过程中的延时,console.log("2")得到处理。
那么javascript中的异步是不是真的异步呢?确实是异步的,不过这个异步的处理不是由javascript引擎来完成,而是在接收到异步请求时,javascript引擎会在浏览器中新开一个线程,请求状态改变之后,将回调任务放在javascript引擎队列的末尾等待处理,javascript引擎始终是单线程在运行函数。
参考:http://www.phpv.net/html/1700.html
function test(){ console.log('1'); setTimeout(function(){ console.log('setTimeout'); },0); console.log('2'); }
结果是这样的:
1
2
setTimeout
那么问题来了,既然定时器时间是0ms,不是应该没有延迟,按顺序执行吗,为什么会这样呢?
这时候就要提到javascript的单线程机制了。javascript为什么是单线程而不是多线程呢,因为javascript是可以操作dom元素的,如果这里有两个事件,一个要增加dom元素,一个要删除dom元素,如果是多线程进行,那么无法确定哪一个事件先执行完毕,哪一个后执行完毕,这样会造成混乱,所以单线程。javascript的单线程机制的工作流程是这样的,每个任务到来之后,在前面的任务没有执行完之前,只能放在队列的末尾等待。console.log('0')执行之后,本来应该按顺序执行setTimeout线程,但是,setTimeout线程实际上是一个异步线程,因为它不是依靠javascript引擎来计时的,因为一旦javascript引擎的线程阻塞,计时就无法进行,因为浏览器是多线程的,所以这里实际上是在浏览器中新开一个线程进行计时,时间到了之后,再把任务返回给javascript引擎进行处理,而javascript引擎在空闲时会插入下一个任务,计时器移交过程中的延时,console.log("2")得到处理。
那么javascript中的异步是不是真的异步呢?确实是异步的,不过这个异步的处理不是由javascript引擎来完成,而是在接收到异步请求时,javascript引擎会在浏览器中新开一个线程,请求状态改变之后,将回调任务放在javascript引擎队列的末尾等待处理,javascript引擎始终是单线程在运行函数。
参考:http://www.phpv.net/html/1700.html
相关文章推荐
- Javascript对象中关于setTimeout和setInterval的this介绍
- js event 属性
- 详解Javascript 中的this指针
- Javascript-BinarySearchTree
- Firebug控制台详解,让调试js代码变得更简单
- 使用jsp读取HTML格式文件
- JavaScript中var关键字的使用详解
- 使用jsp读取TXT格式文件
- js 判断是否是数组
- js实现当复选框选择匿名登录时隐藏登录框效果
- 【JS】垃圾回收和块级作用域
- js string 和 json 互转
- Javascript是单线程的深入分析
- javascript中substr函数和substring函数的区别
- js模拟复制
- JavaScript学习笔记之DOM基础 2.4
- 【BZOJ1029】【JSOI2007】【建筑抢修】【贪心+堆】
- 关于JavaScript的变量的数据类型的判断方法
- 异步加载js(3)
- 关于cookie储存用serialize方式或json_encode方式转化的数组问题