Day20
1-js 是单线程还是多线程?
单线程,单位时间内只能处理一个进程
所以会有线程阻塞问题(使用回调函数解决)或者异步同步问题
2-let 和 var 声明变量的区别?
let 是块级作用域,函数内部使用let 定义后,对函数外部无影响,如果不初始化输出的话,会报语法错误 let没有预解析
var 全局变量,声明的变量可以修改,如果不初始化输出的话,会报undefined,但不会报错 var定义变量会有预解析
3-说说 async/await 的使用方式和场景
async 就是异步的意思,在函数的定义前加上 async 关键字,表示这是一个异步函数,意味着该函数的执行不会阻塞后面代码的执行。
async function hello() {
console.log('hello before');
return 'hello after';
}
hello().then(value => console.log(value))
console.log('world');
上面的代码输出结果:
hello before
world
hello after
为什么 hello after 会在 world 后输出呢?这是因为 Promise 在 JavaScript 内部的运行机制,Promise 属于「微任务」,在当前脚本代码执行完后,立刻执行的,并没有参与事件循环。
既然返回值是 Promise,那么说明函数的执行也有对应的状态,如果函数正常执行,内部调用 Promise.resolve(),如果函数有错误,则调用 Promise.reject() 返回一个 Promise 对象。
await 就是等待的意思,即等待请求或者资源。await 后面可以接任何普通表达式,但一般会在 await 后面放一个返回 promise 对象的表达式。
注意 :await 关键字只能放到 async 函数里面。
如果 await 等待的是一个 Promise,它就会阻塞后面的代码,等着 Promise 对象 resolve,然后得到 resolve 的值,作为 await 表达式的运算结果。
看到「阻塞」两个字,心里咯噔一下。尼玛,这一阻塞,函数外的代码不会也暂停执行么。
**这个你不用担心,这就是 await 必须用在 async 函数中的原因。**async 函数调用不会造成阻塞,就像上文所描述的。它内部所有的阻塞都被封装在一个 Promise 对象中异步执行。
先来看下面的代码:
function delay(seconds) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(seconds)
}, seconds);
});
}
async function hello() {
console.log('hello');
let result = await delay(2000);
console.log(result);
}
hello();
console.log('world');
上面定义了一个 delay 函数,接受一个 seconds 参数。函数返回一个 Promise 对象,这个 Promise 对象传入的是一个定时器。
然后在 hello函数中去调用 delay 函数,指定 await 关键字。当代码执行到result 这一行是,会阻塞 2 秒钟。等 Promise 的 resolve,返回执行结果,然后赋值给 result,代码才开始继续执行,执行下一行的 console.log 语句。
输出结果如下:
hello
world
// 两秒后...
2000
这样我们就以同步代码的方式编写了一段异步请求的函数,如果遇到多个异步的代码,await 更能体现出写法上的可读性。
例如下面的代码:
async function hello() {
console.log('hello');
let result1 = await delay(2000);
let result2 = await delay(3000);
let result3 = await delay(4000);
console.log(result1+result2+result3);
}
如果用 Promise :
delay(2000).then(res=> {
console.log(res);
return delay(3000);
}).then(res => {
console.log(res);
return delay(4000);
}).then(res => {
console.log(res);
})
可以看到,使用 await 写异步代码真的非常的方便,而且代码的可读性非常的好,也没有回调地狱了
4-谈谈对 promise 的理解
Promise 对象是一个代理对象(代理一个值),被代理的值在Promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步
方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象
5-箭头函数有什么作用和实际应用场景?
(1)简明的语法
(2)隐士返回,如 下面的代码可以去掉return,代码移到一行,减少代码量。
(3)解决了this的指向问题,原生的写法this指向的是调用者,箭头函数this绑定的是定义时的那个对象。
实际应用场景:需要保留this指向的时候
浙公网安备 33010602011771号