您的位置:首页 > Web前端 > JavaScript

javascript执行顺序

2015-08-14 15:59 483 查看
        在网上搜索javascript执行顺序,很多人直接简单粗暴地告诉你,javascript是按照从上到下的顺序执行的,作为一个对于javascript了解不深的人,觉得非常有道理,平时的使用中貌似也就是这样从上往下执行的。大神建议看一下"setTimeout(function(){},0);",看一下执行的顺序,于是test以下代码:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: