标准答案
- 函数声明会整体提升,在声明语句之前也可以调用。它适合定义稳定的命名函数,调试栈也比较清楚。
- 函数表达式是把函数作为值赋给变量。它的提升行为取决于变量声明方式:var 会先得到 undefined,let/const 在声明前处于暂时性死区。
- 箭头函数是函数表达式的一种,没有自己的 this、arguments、super 和 new.target,也不能作为构造函数。它适合短回调和需要捕获外层 this 的场景。
- 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 是特殊语法,其实只是函数表达式立即调用。