uploadhub的技术博客 uploadhub的技术博客
首页
  • 学习笔记

    • 《HTML5和CSS3篇》
    • 《JavaScript基础篇》
    • 《JavaScript高级篇》
    • 《Ajax篇》
    • 《JavaScript模块化篇》
    • 《Node.js篇》
    • 《MongoDB篇》
    • 《Promise篇》
    • 《Git篇》
  • 《Vue2+Vue3篇》
  • 《React篇》
  • 一面-基础
  • 二三面-进阶
关于我
  • 分类
  • 标签
  • 归档

uploadhub

首页
  • 学习笔记

    • 《HTML5和CSS3篇》
    • 《JavaScript基础篇》
    • 《JavaScript高级篇》
    • 《Ajax篇》
    • 《JavaScript模块化篇》
    • 《Node.js篇》
    • 《MongoDB篇》
    • 《Promise篇》
    • 《Git篇》
  • 《Vue2+Vue3篇》
  • 《React篇》
  • 一面-基础
  • 二三面-进阶
关于我
  • 分类
  • 标签
  • 归档
  • JS基础知识(一)-变量类型和计算
  • JS基础知识(二)- 原型和原型链
  • JS基础知识(三)- 作用域、闭包
  • JS基础知识(四)- 异步和单线程
    • 1.几道面试题(以点带面)
    • 2.涉及知识点
      • 2.1 什么是异步
      • 2.2 何时需要异步
      • 2.3 前端使用异步的场景
      • 2.4 单线程与setTimeout
    • 3.对前文问题的解答
      • 3.1 同步和异步的区别是什么?分别举一个同步和异步的例子
      • 3.2 一个关于setTimeout的笔试题
  • JS基础知识(五)- 异步进阶
  • JS-Web-API(一)- DOM & BOM
  • JS-Web-API(二)- 事件
  • JS-Web-API(三)- Ajax
  • JS-Web-API(四)- 存储
  • HTTP协议及缓存机制
  • 开发环境
  • 运行环境
  • 一面-基础
uploadhub
2022-05-28
目录

JS基础知识(四)- 异步和单线程

# 1.几道面试题(以点带面)

  1. 同步和异步的区别是什么?分别举一个同步和异步的例子

  2. 一个关于setTimeout的笔试题

  3. 前端使用异步的场景有哪些

# 2.涉及知识点

  1. 什么是异步(对比同步)
  2. 前端使用异步的场景
  3. 异步和单线程

# 2.1 什么是异步

异步

console.log(100);
setTimeout(function() {
  console.log(200);
}, 1000);
console.log(300);
//结果:100 300 200【1s后打印】
1
2
3
4
5
6

同步

console.log('upload');
alert('you');
console.log('hub');
1
2
3

# 2.2 何时需要异步

  1. 在可能发生等待的情况
  2. 等待过程中不能像alert一样阻塞程序运行
  3. 因此,所有的“等待的情况”都不要异步

# 2.3 前端使用异步的场景

  1. 定时任务:setTimeout、setInterval
  2. 网络请求:ajax请求,动态<img>加载
  3. 事件绑定

ajax请求代码示例

console.log('start');
$.get('./data1.json', function(data(1)){
	console.log(data1);
});
console.log('end');
1
2
3
4
5

img加载

console.log('start');
var img = document.createElement('img');
img.onload = function() {
	console.log('loaded');
}
img.src = '/xxx.png';
console.log('end');
1
2
3
4
5
6
7

事件绑定

console.log('start');
document.getElementById('btn1').addEventListener('click',function() {
	alert('clicked');
})
console.log('end');
1
2
3
4
5

# 2.4 单线程与setTimeout

console.log(100);
setTimeout(function() {
  console.log(200);
});
console.log(300);
//结果: 100 300 200
1
2
3
4
5
6

以上程序执行过程分析:

  1. 执行第一行,打印100
  2. 执行setTimeout后,传入setTimeout的函数会被暂存起来,不会立即执行(单线程的特点,不能同时干两件事)
  3. 执行最后一行,打印300
  4. 待所有程序执行完,处于空闲状态时,会立马看有没有暂存起来的要执行。
  5. 发现暂存起来的setTimeout中的函数无需等待时间,就立即过来执行

# 3.对前文问题的解答

# 3.1 同步和异步的区别是什么?分别举一个同步和异步的例子

  1. 基于 JS 是单线程语言
  2. 同步会阻塞代码执行,而异步不会
  3. alert是同步,setTimeout 是异步

# 3.2 一个关于setTimeout的笔试题

for(var i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i);
  },i*1000)
}
//以上执行结果是:每过1s都输出5
1
2
3
4
5
6

修改让其每隔1s弹出0,1,2,3,4

法一:

for(var i = 0; i < 5; i++) {
  (function(i) {
    setTimeout(function() {
      console.log(i);
    },i*1000)
  })(i); 
}
1
2
3
4
5
6
7

法二:

for(var i = 0; i < 5; i++) {
  setTimeout((function(i) {
    return function() {
      console.log(i);
    }
  })(i),i*1000)
}
1
2
3
4
5
6
7

法三:

for(let i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i);
  },i*1000)
}
1
2
3
4
5

法四: ES7的 async/await

function sleep(interval) {
  return new Promise(resolve => {
    setTimeout(resolve, interval);
  })
}

// 用法
async function countInAsync() {
  for(let i = 0; i < 5; i++) {
    console.log(i);
    await sleep(1000);
  }
}

countInAsync();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

setTimeout 不支持传带参数的函数

#面试#异步
JS基础知识(三)- 作用域、闭包
JS基础知识(五)- 异步进阶

← JS基础知识(三)- 作用域、闭包 JS基础知识(五)- 异步进阶→

最近更新
01
HTTP协议及缓存机制
05-28
02
开发环境
05-28
03
JS基础知识(一)-变量类型和计算
05-28
更多文章>
Theme by Vdoing | Copyright © 2021-2023 uploadhub | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式