在准备js面试题时,遇到了许多知识盲区,或是已经遗忘的知识,所以来写一下博客,记录自己的成长,同时查漏补缺
异步,原型和原型链,闭包被称为js的三座大山,为何会有异步?那我们要来捋一下
js是一门单线程的语言,通俗点讲就是在一个时间段它只能做一件事,就像一条公路,它一次就只能一辆车通过,不能有两辆车并排着通过的,如果有一辆车,它就停公路上,这样子后面的车没法走,那它就会一直卡着,不会往下执行
看一下代码
console.log(100)
alert(200)
console.log(300)
如果没有点击确定,接下来的300就不会打印,一直停在那里,点击后,才会打印300
所以同步会阻塞代码的执行
异步任务是通过回调函数实现的,它不会阻塞代码的执行,
在执行时会等同步任务执行后再添加到同步代码的后面
下面是一个经典的面试题,不知道异步的同学就很容易答错
console.log(1)
setTimeout(function() {
console.log(2)
},1000)
console.log(3)
setTimeout(function() {
console.log(4)
},0)
console.log(5)
// 执行的结果是 1 3 5 4 2
在上面图中,定时器0毫秒执行,为何会在第四个才打印出来,因为定时器就属于一个异步任务,所以代码执行时会先把同步任务执行后,才把异步的结果拼接到同步任务后面,再轮到异步任务
什么情况下需要异步,一般而言,异步任务有以下三种类型:1.普通事件,如click点击事件等。2.资源加载,如load,还有通过ajax请求数据。3.定时器,包括setInterval,setTimeout等
//ajax
console.log('start')
$.get('./data1.json',function(data1) {
console.log(data1)
})
console.log('end')
//打印顺序 start end data1的值
像网络请求,同步的任务先执行,如何什么时候请求回来,再打印我们的data1的值,如果一直不回来,那就一直挂着!