Skip to content

JS中的异步和同步编程 #41

@Yangxiaqing

Description

@Yangxiaqing

JS是单线程的:
JS一根筋,做着当前的这件事件,没有完成之前,绝对不会做下一件事情。
JS中两种编程思想:同步、异步

同步:

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

for (var i = 0; i < 100000; i++) {
	if(i == 99999) {
		console.log("循环结束了~~~")//(1)
	}
}
console.log("ok");//(2)

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

while (1) {

}
console.log("ok");

永远都不会执行,因为上面的循环是死循环,循环永远都不会结束。

异步:

规划要做一件事情,但是不是当前立马去执行这件事情,需要等一定的时间,这样的话,我们不会等它执行,而是继续执行下面的操作,"只有当下面的事情都处理完成了",才会返回头处理之前的事情;如果下面的事情并没有处理完成,不管之前的事情有没有到时间,都要等着。
在JS中异步编程只有四种情况:

  • 定时器都是异步编程的
  • 所有的事件绑定都是异步编程的
  • Ajax读取数据的时候,我们一般都设置为异步编程
  • 回调还是也是异步编程的

面试题:

1、

var n = 0;
window.setTimeout(function () {
	n++;
	console.log(n);//1-->(2)
}, 1000);
console.log(n);//0 --->(1)

2、

var n = 0;
window.setTimeout(function () {
	n++;
	console.log(n);//1-->(2)
}, 0);
console.log(n);//0 --->(1)

每一个浏览器对于定时器的等待时间都有一个最小的值,谷歌:56ms、IE:1013ms,如果设置的等待时间小于这个值,不起作用,还是需要等到最小时间才执行的;尤其是写0也不是立即执行。
3、

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

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

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 < 10000000; i++) {

}
console.log(n);//0 --(2)

image
5、

for(var i = 0;i < oLis.length;i++){
	oLis[i].onClick = function () {
		tabChange(i);
	}
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions