JS单线程和异步总结

JS为单线程,先同步后异步,只有一个线程,只能做一件事,两段JS不能同时运行

// 循环运行期间,js执行和DOM渲染暂时卡顿
var i, sum = 0
for (i = 0; i < 100000; i++) {
  sum += i
}
console.log(sum)

// alert 不处理,js执行和DOM渲染暂时卡顿

console.log('1')
//alert('2')
console.log('3')

单线程的原因:避免 DOM 渲染的冲突

1、浏览器需要渲染DOM
2、JS 可以修改 DOM 结构
3、JS 执行的时候,浏览器 DOM 渲染会暂停
4、两段 JS 也不能同时执行 (都修改 DOM 就冲突了)

解决方案 - 异步

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

前端使用异步的场景

1、定时任务:setTimeout, setInverval

// setTimeout
console.log(100)
setTimeout(function () {
  console.log(200)    // 1000ms 后运行
}, 1000)              // 先不管他, 先让其他 js 代码运行
console.log(300)
console.log(400)

// 运行结果 100 300 400 200(1000ms后)

2、网络请求: ajax 请求, 动态 加载

// 网络请求

console.log(100)
$.ajax({
  url: 'xxxxxxxx',
  success: function (result) {  // ajax 加载完后运行
    console.log(result)         // 先不管他, 先让其他 js 代码运行
  }
})
console.log(300)
console.log(400)

// 运行结果 100 300 400 result
// img 动态加载

console.log('start')
var img = document.createElement('img')
img.onload = function () {
  console.log('load')
}
img.onerror = function () {
  console.log('error')
}
img.src = "xxxxxxx"
console.log('end')

// 运行结果 start end  load(成功) error(失败)

3、事件绑定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值