函数与闭包
本节目标:定义函数、传入参数、返回结果,并理解词法作用域与闭包。
声明、调用与返回值
函数把一组操作命名起来,便于重复调用。参数是输入,return 结束本次调用并给出结果:
js
function formatTitle(title) {
return `阅读:${title.trim()}`;
}
console.log(formatTitle(" JavaScript 入门 "));函数声明可在所在作用域中提前调用(函数提升)。函数表达式和箭头函数则受变量声明规则约束。箭头函数适合简短回调,但没有自己的 this、arguments,不应机械替换方法或构造函数。
参数
js
function greet(name = "访客", ...topics) {
return `${name} 正在学习:${topics.join("、")}`;
}
console.log(greet("小林", "函数", "对象"));默认参数在对应实参缺省或为 undefined 时生效。剩余参数 ...topics 收集额外参数为数组。现代代码优先用剩余参数代替 arguments,以获得明确的数组语义。
作用域与闭包
函数在定义时形成词法环境,内部函数可访问外层作用域。即使外层函数已经返回,只要内部函数仍引用其变量,这些绑定仍会保留,这种函数与其词法环境的组合称为闭包。
js
function makeCounter() {
let count = 0;
return () => {
count += 1;
return count;
};
}
const next = makeCounter();
console.log(next(), next()); // 1 2闭包可封装状态、创建回调,也可能因长期引用大型对象而延长其生命周期。只保留确实需要的数据。
this 与函数形式
普通函数中的 this 通常由调用方式决定;对象方法以 object.method() 调用时,this 指向调用对象。箭头函数从外层词法环境捕获 this。若需要绑定特定接收者,可使用 bind(),但优先让调用方式清楚。
小结与练习
- 参数传入信息,
return交回结果;不写return的函数返回undefined。 - 闭包让函数访问定义时的外层变量,可用于封装私有状态。
- 箭头函数和普通函数的
this规则不同。
练习:编写 makeAccumulator(start),返回一个函数;每次传入增量后更新并返回累计值。