返回
前端面试官直呼:JS中嵌套函数的写法,说破天了才五个字
前端
2022-11-19 11:31:52
闭包:在 JavaScript 中捕捉变量
简介
闭包是一个在函数中定义的函数,它可以访问函数定义作用域内的变量,即使函数已经执行结束。在 JavaScript 中,闭包是一种强大的工具,因为它允许我们创建私有变量、实现惰性加载并创建模块。
工作原理
JavaScript 中的函数具有自己的执行上下文,其中包括局部变量和对外部作用域的引用。闭包利用这个机制,即使外层函数结束执行,也可以继续访问外层函数的作用域。
示例
// 定义一个外层函数
function outer() {
// 定义一个局部变量
let count = 0;
// 返回一个闭包函数
return function inner() {
// 访问并修改局部变量
count++;
console.log(count);
};
}
// 创建闭包
const inner = outer();
// 多次调用闭包
inner(); // 1
inner(); // 2
作用域
JavaScript 有两种作用域:全局作用域和局部作用域。闭包依赖于词法作用域,这意味着函数的作用域由它定义时的代码块决定,而不是它被调用时的代码块。
词法作用域
词法作用域确保闭包可以访问其定义作用域中的变量,即使它被调用时不在该作用域内。
示例
// 定义一个函数
function outer() {
// 定义一个变量
let count = 0;
// 定义一个闭包函数
const inner = function() {
// 访问变量
console.log(count);
};
// 返回闭包
return inner;
}
// 调用函数
const inner = outer();
// 将变量修改为 10
count = 10;
// 再次调用闭包
inner(); // 10
函数嵌套
函数嵌套是指在一个函数内定义另一个函数。嵌套函数可以使用外部函数的局部变量,这使得闭包更加灵活。
示例
// 定义一个外层函数
function outer() {
// 定义一个变量
let count = 0;
// 定义一个闭包函数
function inner() {
// 访问并修改局部变量
count++;
console.log(count);
}
// 返回嵌套函数
return inner;
}
// 创建闭包
const inner = outer();
// 多次调用闭包
inner(); // 1
inner(); // 2
第一等函数
JavaScript 中的函数是第一等的,这意味着它们可以作为参数传递给其他函数、作为返回值返回,或者存储在数据结构中。闭包利用这个特性来创建灵活且可重用的代码。
高阶函数
高阶函数是可以接收函数作为参数或返回值的函数。闭包可以与高阶函数结合使用,以创建强大的抽象和代码重用。
示例
// 定义一个高阶函数
const map = (array, callback) => {
const result = [];
for (let i = 0; i < array.length; i++) {
result.push(callback(array[i]));
}
return result;
};
// 使用闭包创建自定义回调
const add1 = (num) => num + 1;
// 使用高阶函数应用闭包
const incrementedArray = map([1, 2, 3], add1);
console.log(incrementedArray); // [2, 3, 4]
结论
闭包在 JavaScript 中是一个强大的工具,它允许我们创建私有变量、实现惰性加载和创建模块。理解闭包的工作原理对于编写有效且可维护的 JavaScript 代码至关重要。