03Js面试题

122 阅读2分钟

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

一、第一题

  • 考点:预解析、变量提升
  • var a = b =3;等价于b =3;var = a = b,b = 3;这种定义变量的方式会在预解析时在全局作用域下声明变量b,然后在执行函数时赋值为3,
  • 而变量a因为其时在函数内部声明并定义,所以当函数执行完毕后就会被销毁。
  • 因此在全局作用域下console.log(a)会报错(因为全局作用域下没有变量a),而在全局作用域下console.log(b),会打印3

image.png

二、第二题

  • 考点:预解析
  • 预解析时函数的优先级大于var声明的变量,所有预解析完成之后,a是函数类型。因此第一个console.log(a)打印出的是函数a
  • a = 100;这行代码将100赋值给a,因此第二个console.log(a)打印出的是100

image.png

三、第三题

  • 考点:自执行函数、预解析
  • 自执行函数会自动执行,且没有调用者,因此自执行函数的this=window,而且预解析时函数的优先级最高,所以下面两个题的代码打印的都是100

image.png

image.png

四、第四题

  • 考点:预解析、作用域
  • 代码块内的代码不会进行预解析,所以if{}else{}中变量在预解析都没进行变量提升,因此前四个console.log()打印的都是undefined
  • 在函数执行时,第一个if语句条件为false,所以其中的代码不会执行。第二个if语句中的代码会执行,执行完成之后就声明并定义了函数b2和变量a2,所以这两个console.log()会打印出函数和变量值10,另外两个打印的时undefined

image.png

五、第五题

  • 考点:预解析、变量声明
  • let声明的变量不会进行变量提升,而且if语句中的代码不会进行预解析,所有当执行到arr = 10;时,变量arr未声明未定义,就会报错

image.png