javascript是一门单线程语言,即一次只能完成一个任务,若有多个任务要执行,则必须排队按照队列来执行(前一个任务完成,再执行下一个任务)。
这种模式执行简单,但随着日后的需求,事务,请求增多,这种单线程模式执行效率必定低下。只要有一个任务执行消耗了很长时间,在这个时间里后面的任务无法执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。(弊端)
为了解决这个问题,javascript语言将任务执行模式分成同步和异步:
同步模式: 后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的。
异步模式: 每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。
异步结局方案
1、回调函数
回调函数的定义:
函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。
//定义A函数,回调函数作为参数
function A(callback) {
callback();
console.log('我是主函数');
}
//定义回调函数
function B(){
setTimeout("console.log('我是回调函数')", 3000);//模仿耗时操作
}
//调用主函数,将函数B传进去
A(B);
//输出结果
我是主函数
我是回调函数
可以看见,即使我们把回调函数放在 “console.log(‘我是主函数’); ”前面,先打印输出的依旧是主函数的consloe.log()里面的语句。所以回调函数是否执行完,执行多长时间是不会影响主函数的执行,即使回调函数还没执行完,主函数却依然在执行着自己的代码内容。
2、事件监听
我们也能使用事件监听的方法来解决问题,为事件绑定一个事件监听函数,此时任务的执行不取决代码的顺序,而取决于某一个事件是否发生。
常见的监听函数有:on,listen,addEventListener
1、 onclick():
onclick方法对于一位程序员来说是一个非常常见的方法了,作为一个鼠标点击事件,为他绑定一个事件,通过点击鼠标触发。
element.onclick=function(){
//处理函数
}
缺点:当同一个元素被绑定多个点击事件时,只有最后一个生效。
2、addEventListener()
//标准addEventListener
elment.addEvenListener("click",fun1,false);
elment.addEvenListener("click",fun2,false);
elment.addEvenListener("click",fun3,false);
3、listen()
app.listen(3000,()=>{
console.log("服务启动成功")
})