题目1

  1. var getName = function() {
  2. console.log(4);
  3. };
  4. function getName() {
  5. console.log(5);
  6. }
  7. getName() // 4

由于 js 中的变量提升,影响了代码的执行顺序

  1. 执行 var getName,声明变量 getName,给默认值 undefined
  2. 执行 function getName(){console.log(5)} 声明并初始化函数
  3. 执行 getName = function(){console.log(4)} 对步骤 1 中声明的变量进行赋值

上面代码可转为下面的样子

  1. var getName
  2. function getName() {
  3. console.log(5)
  4. }
  5. getName = function() {
  6. console.log(4)
  7. }

题目2

  1. function t1(age) {
  2. console.log('1', age);
  3. var age = 27;
  4. console.log('2', age);
  5. function age() {}
  6. console.log('3', age);
  7. }
  8. t1(3);
  9. // 1 ƒ age() {}
  10. // 2 27
  11. // 3 27

  1. 传入 age 为 3
  2. 执行 var age,声明变量 age,age 已传入 3,所以默认值是 3
  3. 执行 function age() {},声明并初始化函数
  4. 执行第一个打印语句 console.log('1', age)
  5. 执行赋值 age = 27
  6. 执行第二个打印语句 console.log('2', age)
  7. 执行第三个打印语句 console.log('3', age)

    参考

    《js 函数提升和变量提升》
    《前端工程师面试宝典|this指向》