js同步和异步编程

js是单线程的:做着当前的这件事情,没有完成之前,绝不会做下一件事情

js中的两种编程思想:同步、异步

1.同步

上一件事情没有完成,继续处理上一件事情,只有上一件事情完成了,才会做下一件事情(js中大部分都是同步编程

for(var i = 0;i<1000;i++){
if(i == 999){
console.log("循环结束!");
}
}
console.log("ok");

for循环就是同步编程的,只有循环结束后,才会继续执行下面代码

2.异步

规划要做一件事情,但是不是当前立马去执行这件事情,需要等待一定的时间,我们不会等着它执行,而是继续执行下面的操作,“只有当下面的事情都处理完成了,才会返回头处理之前的事情”,如果下面的事情并没处理完成,不管之前的事情有没有到时间,都得继续等

2.1在js中异步编程只有四种情况

● 定时器

● 所有的事件绑定

● ajax读取数据

● 回调函数

2.1.1 定时器案例

例1:

var n = 0;
window.setTimeout(function(){
n++;
console.log(n);
},1000);
console.log(n);	<span style="white-space:pre">	</span>//0 1

例2:

每一个浏览器对于定时器的等待时间都有一个最小的值,chrome:5~6ms,ie:10~13ms,如果设置的等待时间小于这个值,不起作用,还是需要等到最小时间才执行的,尤其是写0也不是立即执行

var n = 0;
window.setTimeout(function(){
n++;
console.log(n);
},<span style="background-color: rgb(255, 255, 0);">0</span>);
console.log(n);	//0 1

例3:

定时器设置的等待时间不一定就是最后执行的时间,如果定时器之后还有其他的事情正在处理中,不管定时器的时间有没有到,都是不会执行定时器的

var n = 0;
window.setTimeout(function(){
n++;
console.log(n);	//不执行
},0);
console.log(n);	//0
while(1){	//死循环
n++;
}
console.log(n); //不执行

 

解析:任务队列池

 

var n = 0;
window.setTimeout(function(){
n += 2;
console.log(n);	//7 (4)
},20);	//在任务队列池中排在后面

window.setTimeout(function(){
n += 5;
console.log(n);	//5 (3)
},5);	//在任务队列池中排在前面

console.log(n);	//0 (1)
for(var i=0;i<10000001000000;i++){
n++;
}
console.log(n);	//0 (2)

2.1.2 事件绑定

var oLis = document.getElementsByTagName("li");
for(var i=0;i<oLis.length;i++){
oLis[i].onclick = function(){	//异步编程,不会等待,执行onclick时for循环已执行完
console.log(i);
};
(oLis[i].onclick = function(){	//改用此种方式才能达到效果(闭包,私有作用域方式)
console.log(i);
})(i);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值