JavaScript引擎不是独立运行的,它运行在宿主环境(Web浏览器)中。也开始进入NodeJS服务器领域。
JavaScript的事件循环机制,解释了setTimeout()定时器的精度可能不高。因为如果定时器前面排了很多事件循环队列,那么可能会导致滞后,要根据事件队列状态而定。ES6的promise引入,对事件循环队列的调度运行能够精细控制
多线程交替VS异步事件
![](https://img.haomeiwen.com/i16552177/cd5ff3e6ae1eaf00.png)
![](https://img.haomeiwen.com/i16552177/685b7f7fe452fd1e.png)
多线程的方式会导致代码运行结果的不确定性,JS从不跨线程共享数据,但是也不代表js的结果总是确定的,因为如果牵扯到两个异步事件对同一个变量进行输出时,可能会因为响应时间的不确定性,输出不同的结果。
并发请求
比如用户通过onscroll事件下拉刷新列表,可能产生并发请求,此时排在后面的请求可能先响应。JS的事件循环机制只是排队处理请求,但是响应的时间却不能严格控制,所以可能会产生后面的请求较前面早返回的现象。反映在列表中就是,第六页的数据可能较第五页早返回。
JavaScript的事件循环是并发的一种形式
事件循环:javascript中的程序代码块的执行依赖于javascript引擎(没有时间概念的),它按需执行js任意代码,事件Event的调度总是由包裹它的环境(宿主环境,即web浏览器)进行。所以一般异步事件会排在队列后面,等前面的程序执行结束,才开始执行异步。事件循环的每一轮称为一个tick。
![](https://img.haomeiwen.com/i16552177/a1c15d166e3e147d.png)
任务队列:挂在事件循环队列的每个tick后的一个队列。任意时刻,一次只能从队列中处理一个事件,执行事件的时候,可能直接或间接地引发一个或多个事件。
小狮子盘到的代码:
筛选数组里面每种数据类型的方法==>
const filter = (predicate,xs) => xs.filter(predicate);
const is = (type) => (x) => Object(x) instanceof type;
filter(is(Number),[0,'1',2,null]); //[0, 2]
filter(is(Array),[[1,2,3],123,[4,5,6]]); // [[1,2,3], [4,5,6]]
filter(is(String),[100,'cherry','apple',true,[1,2,3]]); //["cherry", "apple"]
function ff(expectFn,originData){
return originData.filter(expectFn);
}
function is(type){
return function(x){
return Object(x) instanceof type;
}
}
ff(is(Number),[0,'1',2,null]); //[0, 2]
网友评论