JS每日一题|var的使用

518 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

题目序号:17
日期:2022-05-25 周三
收录专栏:《JavaScript每日一题》

昨日每日一题

题目

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);

答案

1,2,3,4,5,8,9,6,7

解析

首先,我们先来大致看一下代码,发现是async与console.log是交替执行,这也为我们的同步、异步任务埋下了伏笔;最先输出的是1,想必这个肯定是没有问题的吧!随后调用foo函数,输出2,然后便遇到了console.log(await Promise.resolve(8)),我们知道console.log是一个输出语句,本质为console身上的log方法,而log方法的任务就是将值打印在控制台中,而这个值现在是await Promise.resolve(8),Promise.resolve(8)会得到一个立即可用的值8,但await是异步求值,所以这个立即可用的值8会在下一轮任务队列中才能拿到,随后便跳出foo函数,输出3。同样,遇到了bar函数,同理,输出4,跳出bar函数,输出5;这篇文章还没点赞的兄弟要格外注意了,此时所有同步代码均已执行完毕,但异步任务队列中还有两个任务,依次为foo、bar,这个时候eventloop(任务轮询)要进行表演了,先把foo拿出来执行,得到8这个值,然后输出8,紧接着输出9;同理,依次输出6、7;此时队列为空,所有任务均已执行完成,这下可以先点赞了吧。

今日每日一题

前言

时至2022年,想必大家在开发中已经使用let、const逐渐代替var了吧。在ES6之前我们不得不使用var来进行声明变量,但是var所带来的的缺点也一览无余,污染全局命名空间、只有全局作用域和函数作用域等等。虽然let、const已经逐渐成为主流,但在面试中还是会有关于var的题目,既然如此,那我们今天的每日一题不妨也来一道关于var的题目。

题目

var f = function () {
    if (!n) {
        var n = n2 = 1
    }
    n = 2
}
f()
var n
var n2 = 4
f()
console.log(n,n2)

解析

使用var声明的变量存在变量提升的情况,换句话说就是一个使用var声明的变量,可以在声明之前就可以被访问到,只是值为undefined。且var拥有全局作用域函数作用域,如果想在嵌套的函数作用域中访问到全局作用域中的变量,那么可以使用window来进行访问。另外就是链式赋值,比如题目中的var n = n2 = 1,要注意这里的n和n2是否都是用var来声明的,其次调用两次f函数的目的是什么、调用两次会发什么,或者说有什么不同。

结语

如果你对本专栏《JavaScript每日一题》有任何建议,欢迎反馈,博主一定会耐心听取;如果你对今天的《每日一题》有任何问题、不懂的地方,请在评论区留言,与大家一起讨论吧~
创作不易,少年,就请留个赞再走吧!