单线程,可是js的引擎不仅有一个线程,还能够其余任务线程;
事件驱动:触发事件就执行。
采用事件循环机制,先将主线的任务(同步)执行完毕,在执行队列任务(异步)。不断这样循环执行。
node非阻塞I/O模型:将循环查看是否有任务队列(其余线程)中是否有任务等待;异步I/O。javascript
同步任务:主线程将代码一步步执行下来,须要等待。
异步任务:引擎会将异步代码放在另任务队列中,等待同步的代码执行完毕,才进行异步代码的执行。java
eg:node
function f1(){ console.log(1) } function f2(){ console.log(2) } f1() f2() //上述代码是同步的,因此f2须要f1执行完才会执行。 //改为异步,就是将f2改为f1的回调。 function f1(){ console.log(1) } function f2(){ console.log(2) } f1(f2); //f1(f2())
事件驱动机制,就是绑定一个事件,触发该事件后才执行。列如,js的addEventListener、jquery的on()方法、定时器、jquery
//js window.addEventListener("click",function(){ alert(1111) }) window.click(); //jquery f1.on("success",f2) function f1(){ ajax(url,function(){ f1.trigger("success") }) } //jquery f1.on("done",f2); function f1(){ setTimeout(function(){ f1.triggle("success"); },1000) } //定时器 var num=1; setTimeout(function f2(){ num++; console.log(num); }) console.log(num);
结论:能够绑定多个监听事件;造成多个回调,利于模块化。可是因为事件驱动,因此很难看出主流程。es6
事件彻底能够理解为“信号”,若是存在一个“信号中心”,某个任务执行完成,就向事件中心”发布“。其余任务则向”信号中心“询问状况。从而知道何时本身能够开始。ajax
//利用jquery的插件实现 //首先,f2向消息中心订阅success事件 jQuery.subscribe('success',f2); //对f1进行改写: function f1(){ ajax(url,() => { //todo jQuery.publish('success');//当f1执行完毕后,向消息中心jQuery发布success事件,从而执行f2函数 }) } //f2执行完毕后,能够取消订阅 jQuery.unsubscribe('success',f2)
es6语法异步