js高级_123、js是单线程执行的

1、如何证明js执行时单线程的?

setitmeout()的回调函数是在主线程执行的。

定时器回调函数只有在运行栈中的代码全部执行完后才有可能执行。

2、为什么js要用单线程模式,而不用多线程

javascript的单线程,于它的用途有关。
作为浏览器脚本语言,javascript的主要用途是与用户交互,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的线程同步问题。比如:有一个text文本框对象,现在有两个线程t1和t2要对这个对象进行操作。t1要更改它的内容,t2要删除这个文本框对象,那么现在如果是t1在执行,但是此时cpu把时间分配给了t2,那t2就把 这个对象删了,然后cpu又把时间分配给了t1,此时对象已经没了,t1去修改就会报错。可以解决这个问题,就是t1在操作对象的时候上锁,这样同就保证了一个操作必须要执行完才可以对这个对象进行其它操作。即使轮到t2操作这个对象,那么t2也无法操作它。

3、代码分类

初始化代码

回调代码(回调函数)

回调函数也叫异步执行,也就是某些代码必须在初始化代码执行完成后才可能被执行。(这里的异步和C#里的多线程的异步概念不一样 ,js是没有多线程的,而C#的异步是真的有分线程在执行。)

4、js引擎执行代码的基本流程

①先执行初始化代码:包含一些特别的代码比如:

设置定时器(里面的回调函数不会执行,等初始化代码执行完后执行。)
绑定事件监听(事件回调函数代码不会执行,,等初始化代码执行完后事件发生时执行)
发送ajax请求

②初始化代码执行完了后面再某个时刻才会执行回调代码。

alert弹窗会暂停当前主线程的执行。

setTimeout(function(){
	console.log(222222)
},2000);

setTimeout(function(){
	console.log(111)
},1000);

function fn(){
	console.log("fn");
}

fn();


console.log("alert之前");

alert("暂停");//暂停当前主线程的执行,同时暂停计时,点击确定后,恢复程序执行和计时。
console.log("alert之后")

执行顺序:
image

posted @ 2022-03-15 18:58  青仙  阅读(84)  评论(0编辑  收藏  举报