1、每天一道前端题

2020-05-07  本文已影响0人  4691a48010dd
题目

思考当前代码执行后输出什么内容

》》》

》》》

》》》

》》》

》》》

》》》

》》》

》》》

》》》

》》》

》》》

》》》

》》》

》》》

》》》

》》》

》》》

》》》

答案

   打印顺序: undefined   3  1  2

    这里主要涉及到的知识点有setTimeout 执行的问题和变量提升的问题。

    首先setTimeout 虽然在代码最前面被先执行,并且第二个参数也没有设置时长,但打印的却是最后一行a变量赋值为2后的值,因为js是单线程执行,尽管setTimeout并没有设置时长,它还是会等其他代码执行完以后再执行里面的回调函数,所以setTimeout方法会是最后一个执行。

    从代码拓展一个作用域链的知识点,setTimeout的回调函数中没有定义过a变量,它会一直往上一层的作用域中进行查找,一直到找到window结束,当前setTimeout的回调函数中打印的a是来自window作用域中的a,window作用域中的a执行到代码结束时已经被赋值为2,所以它才会打印2

    第二个console为什么打印undefined,var关键词声明的变量会出现变量提升,提升到当前作用域的最前面,默认值为undefined,直到执行赋值代码才会产生有效值,我们第二个console在赋值语句之前执行,还是未赋值的状态,所以打印的是undefined

    如果我们把var关键词换成let会是什么效果,好奇的可以自己尝试一下

上一篇下一篇

猜你喜欢

热点阅读