返回

前端面试官直呼:JS中嵌套函数的写法,说破天了才五个字

前端

闭包:在 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 代码至关重要。