题目序号:16
日期:2022-05-24 周二
收录专栏:《JavaScript每日一题》
题目来源:《JavaScript高级程序设计(第四版)》
昨日每日一题
题目
function A() {}
A.prototype.n=1
var b=new A()
A.prototype={
n:2,
m:3,
}
var c=new A()
console.log(b.n,b.m)
console.log(c.n,c.m)
答案
1,undefined,2,3
解析
function A() {} 定义了一个函数,随后将该函数的原型对象中的n设为1,然后new A()得到它的实例对象b(通过new调用A时,A才为构造函数,原型对象才会生效)。随后将A的原型对象指向了一个新的对象,这里需要注意的是,b仍然引用着之前的原型对象,所以b.n为2,b.m为undefined。再次new A()得到它的实例对象c,此时c的__proto__指向的是新的原型对象,所以c.n为2,c.m为3。
今日每日一题
前言
我们如果想在网页中发送网络请求,那么通常是使用xhr(XMLHTTPRequest)或者JS自带的fetch来发送请求,两者之间的差异在此尚不讨论,而无论使用哪种方式,我们必须要面对的一个问题就是:当请求发送成功时,我们如何拿到请求的数据(response)。在ES6尚未面世之前,显然我们是通过回调函数的形式来进行处理的,而随着嵌套请求的增多,回调函数的数量势必也会越来越多,从而形成了我们常说的“回调金字塔”或者“回调地狱”。
题目
// 以下代码块的输出结果为:
async function foo() {
console.log(2);
console.log(await Promise.resolve(8));
console.log(9);
}
async function bar() {
console.log(4);
console.log(await 6);
console.log(7);
}
console.log(1);
foo();
console.log(3);
bar();
console.log(5);
解析
- JS中将任务划分为同步任务与异步任务,而异步任务中则又包含微任务、宏任务(此处暂不讨论微、宏任务);而async则隶属于异步任务,异步任务的执行顺序位于同步任务之后。
- 再来看console.log函数,console.log函数则为同步任务,是先于async执行的,那大家可能会有这么一个疑问,console.log既然是同步执行了,那不应该是立即输出吗?没错,console.log虽然是同步函数,但是我们要注意,这个.log函数虽然接收了参数,但是这个.log函数是有返回值的,也就是一个“求值”的过程,这个值拿不到,它是不会输出的。
- await关键字其实是一个异步求值的过程,哪怕是await后面跟着一个立即可用的值,它仍会异步求值,也就是说await会在下一轮任务轮询(eventloop)中得到该值。
结语
如果你对本专栏《JavaScript每日一题》有任何建议,欢迎反馈,博主一定会耐心听取;如果你对今天的《每日一题》有任何问题、不懂的地方,请在评论区留言,与大家一起讨论吧~
创作不易,少年,就请留个赞再走吧!