JavaScript函数选型无唯一正确方式,关键取决于this绑定、执行时机、复用性及模块导出需求:普通函数声明可提升且this由调用决定;函数表达式与箭头函数不提升,后者无this和arguments;Generator与async函数分别返回迭代器和Promise,均不可构造实例。

JavaScript 中定义函数没有唯一“正确”方式,关键看你要解决什么问题:需不需要绑定 this?是否立即执行?是否要被多次复用?是否在模块中导出?选错类型会导致 this 指向异常、箭头函数无法用 new、或 arguments 不可用等实际问题。
普通函数声明(function declaration)
用 function 关键字 + 函数名 + 括号定义,会被**提升(hoisted)**,可在声明前调用。
适用场景:需要在定义前就调用的工具函数,或作为模块主入口;不推荐在条件块内使用(行为不一致)。
- 不能用
await直接修饰(需包裹在 async 函数内) -
this由调用方式决定(如obj.fn()中this是obj) - 有独立的
arguments对象,可访问所有实参
function sum(a, b) {
console.log(arguments.length); // 2
return a + b;
}函数表达式与箭头函数(function expression / arrow function)
函数表达式是把函数赋给变量,不会被提升;箭头函数是其语法糖,但语义完全不同——它没有自己的 this、arguments,也不能用 new 实例化。
立即学习“Java免费学习笔记(深入)”;
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
常见错误:在对象方法里用箭头函数导致 this 指向外层作用域,而非当前对象。
- 箭头函数适合简短回调(如
array.map(x => x * 2))、避免手动绑定this - 函数表达式适合需要命名调试、或需被
name属性识别的场景(const fn = function namedFn() {}) - 两者都不支持重复声明同名变量(
const fn = ...再次赋值会报错)
const multiply = function(a, b) { return a * b };
const double = (x) => x * 2;Generator 函数和 async 函数
这两类是特殊函数,语法上加了 * 或 async 前缀,返回值不是普通值而是迭代器或 Promise。
别误以为 async function 只是“带 await 的函数”——它强制返回 Promise,即使你 return 123,实际返回的是 Promise.resolve(123)。
- Generator 函数用
yield暂停执行,适合实现状态机、惰性序列(如分页迭代) - async 函数中
await只对 thenable 有效;await null会立即 resolve,但await undefined也会(别依赖这个行为) - 两者都不能用作构造函数(
new asyncFn()报TypeError)
async function fetchUser(id) {
const res = await fetch(`/api/users/${id}`);
return res.json();
}
function* range(start, end) {
for (let i = start; i < end; i++) yield i;
}
真正容易被忽略的点在于:函数类型一旦选定,就锁定了它的 this 绑定机制、实例化能力、参数处理方式。比如把一个本该是普通函数的方法写成箭头函数,后续加事件监听器时 this 就突然失效;又比如在需要 arguments.callee 的老代码里换成箭头函数,直接报错。选型不是语法习惯问题,而是运行时契约问题。









