原型
jquery和zepto如何使用原型(难)
异步
线程
为什么JS只能是一个线程?
- 浏览器需要渲染DOM
- JS可以修改DOM结构
- JS执行的时候,浏览器DOM渲染会暂停
- 两段JS也不能同时执行(都修改DOM就冲突了)
eventloop
- 事件轮询,JS实现异步的具体解决方案
- 同步代码,直接执行
- 异步函数先放在 异步队列中
- 待同步函数执行完毕,轮询执行 异步队列 的函数
jQuery的Deferred
- 无法改变JS异步和单线程的本质
- 只能从写法上杜绝callback这种形式
- 它是一种语法糖形式,但是解耦了代码
- 很好地体现:开放封闭原则(对扩展开放,对修改封闭)
promise
- 异常捕获
- 多个串联
- promise.all和promise.race
promise标准
- promise实例必须实现then这个方法
- then()可以接收两个函数作为参数
- then()返回的必须是一个promise实例
async/await
function loadImg(src) {
const promise = new Promise(function(resolve, reject){
var img = document.createElement('img')
img.onload = function(){
resolve(img)
}
img.onerror = function () {
reject()
}
img.src = src
})
return promise
}
const src1 = 'http://xxx'
const src2 = 'http://xxx'
const load = async function () {
const result1 = await loadImg(src1)
console.log(result1)
const result2 = await loadImg(src2)
console.log(result2)
}
load()
- 使用了Promise,并没有和promise冲突
- 完全是同步的写法,再也没有回调函数
- 但是:改变不了JS单线程、异步的本质
网友评论