01Js面试题

82 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、第一题

  • 考点:作用域,this,变量提升
  • 函数没有被调用时,它的this=window
  • 使用var声明的变量回进行变量提升
  1. 第一个console.log(a):函数中的var a;会进行变量提升,所以在第一个console.log(a)前会声明变量a,然后将100赋值给a,因此此处打印100
  2. console.log(this.a):this=window,所以此处的a指全局变量a,即a=10
  3. 第二个console.log(a):同第一个console.log(a),因为搜索a是会先查找函数作用域,找不到再找全局作用域。此时能在函数作用域里找到a=100

image.png

二、第二题

  • 考点:自执行,作用域,预解析
  • var a = b =3;=>b=3,var a=b
  • 在非严格模式下,b=3就会在全局作用域下定义一个变量,再赋值为3.因此b是全局变量,a是函数内的局部变量

image.png

三、第三题

  • 考点:事件循环,等待队列,异步
  • 输出三个4 主线程在执行到for循环时,遇到setTimeout()时会把setTimeout()放到等待队列中继续执行for循环,for循环执行完毕后i=4,此时主线程空闲了,就依次执行等待队列中的任务,由于var声明的是全局变量,在执行setTimeout()代码时,在私有作用域中没有i,就会去全局作用域查找,找到i=4,所以会输出三个4

image.png

当将i的类型由var改为let时,由于let声明的变量是有作用域的,所以每次循环的i值都会对应存到setTimeout()的作用域中,所以当主线程执行等待队列中的任务时,会依次输出123

image.png

四、第四题

  • 考点:作用域,变量提升,参数

image.png

image.png

image.png

image.png