标准答案

  1. 函数声明会整体提升,在声明语句之前也可以调用。它适合定义稳定的命名函数,调试栈也比较清楚。
  2. 函数表达式是把函数作为值赋给变量。它的提升行为取决于变量声明方式:var 会先得到 undefined,let/const 在声明前处于暂时性死区。
  3. 箭头函数是函数表达式的一种,没有自己的 this、arguments、super 和 new.target,也不能作为构造函数。它适合短回调和需要捕获外层 this 的场景。
  4. IIFE 是立即执行函数表达式,常用于创建独立作用域、封装初始化逻辑和避免变量污染。在 ES Module 和块级作用域普及后用得少了,但仍有助于理解早期模块化。

题目解析

这几个写法的差异集中在提升、this、arguments、能否 new、是否立即执行。复述时按这些维度比较,比只列语法更清楚。

箭头函数不是普通函数的完全替代。对象原型方法、构造函数、需要动态 this 的事件处理器,都不适合无脑改成箭头函数。

函数声明在块级作用域中的历史行为存在兼容差异。现代严格模式和模块环境下更可预测,旧环境代码仍要谨慎。

代码示例

下面示例展示函数声明提升、函数表达式的暂时性死区、箭头函数 this 和 IIFE。

JavaScript
declared() // 可以调用

function declared() {
  return 'function declaration'
}

const expressed = function () {
  return 'function expression'
}

const user = {
  name: 'Alice',
  sayLater() {
    setTimeout(() => {
      console.log(this.name)
    }, 0)
  }
}

;(function init() {
  const privateValue = 1
  console.log(privateValue)
})()

常见误区

  • 把箭头函数用于需要动态 this 的对象方法。
  • 误以为函数表达式也能像函数声明一样完整提升。
  • 以为 IIFE 是特殊语法,其实只是函数表达式立即调用。

作者信息