本文将系统梳理 JavaScript 中闭包与递归的核心概念、实战应用及面试要点,涵盖课堂知识点、作业实现、面试题解析等内容,帮助你全面掌握这两大重要概念。
一、闭包:函数与变量的绑定艺术
1.1 闭包的定义与核心特性
闭包是 JavaScript 中一种特殊的语言现象,其核心定义可从两个角度理解:
-
老师的理解:闭包是"在一个函数中定义另外一个函数",内部函数可以访问外部函数中定义的变量,每调用一次外部函数,就会产生一个独立的闭包(变量环境)。
-
个人的理解:闭包是"声明的变量 + 访问该变量的内部函数"的组合,能够解决变量重名冲突问题,让外部函数的循环变量与内部函数变量相互独立,避免"循环变量最终值覆盖所有内部函数引用"的问题。
闭包的关键特性:
- 内部函数可以访问外部函数的变量
- 内部函数与外部函数变量同名时,内部变量会覆盖外部变量
- 每次调用外部函数会创建独立的闭包环境
- 可用于实现变量封装和模块化
// 闭包基本示例
var a = function() {var x = 1; // 外部函数变量return function() { // 内部函数(闭包)x++;alert(x);}
};var a1 = a();
a1(); // 2
a1(); // 3(保持状态)var a2 = a();
a2(); // 2(独立闭包环境)
1.2 闭包的典型应用场景
场景1:解决循环中的变量共享问题
function helper(n) {return function() {alert(n);}
}function perform() {var arr = [];for(var i = 0; i < 5; i++) {arr[i] = helper(i); // 每次循环创建独立闭包}return arr;
}// 点击不同按钮会显示不同索引
window.onload = function() {var btns = document.querySelectorAll('[type="button"]');for(var i