了解 JavaScript 中的回调函数和闭包。

2025-05-27

了解 JavaScript 中的回调函数和闭包。

大家好,

在这篇文章中,我们将探讨 HOF(高阶函数)、回调和疯狂的 JavaScript 闭包,这些内容让我们在学习过程中的某个时刻感到头疼。

高阶函数

接受函数定义作为参数和/或返回函数的函数是 HOF(高阶函数)。

例如:



function isEven(n) {
  return n % 2 === 0;
}

function printMsg(evenFunc, num) {
  const isEven = evenFunc(num);
  console.log(`The number ${num} is even: ${isEven}`);
}

printMsg(isEven, 2);


Enter fullscreen mode Exit fullscreen mode

在上面的代码片段中,printMsg高阶函数,因为它接受 isEven 函数作为参数。

回调

回调函数是将一个函数作为参数传递给另一个函数,以便稍后执行。在最后一段代码中,isEven就是一个回调函数。

之所以称为回调,是因为它回调到它被创建的地方。

我们再看一个例子。



let numbers = [1, 2, 4, 7, 3, 5, 6];

function isOddNumber(number) {
  return number % 2 !== 0;
}

function oddNumbers = numbers.filter(isOddNumber);
console.log(oddNumbers); // [1, 7, 3, 5]


Enter fullscreen mode Exit fullscreen mode

在上面的代码片段中,isOddNumber是回调函数。因为isOddNumber作为参数传递给了过滤函数。

回调函数可用于处理异步 JavaScript。

闭包

执行上下文中,我们知道函数返回后,它会从调用栈中移除,并从执行上下文中删除。因此,记住这一点,这里是闭包的定义。

闭包是一种函数,即使在外部函数返回后,它仍然可以访问外部变量。

一旦外部函数返回,它就会从调用栈中移除,并从执行上下文中删除。但内部函数仍然可以访问外部函数变量。这个概念被称为闭包



let x = 10;

function foo() {
  let y = 20;

  function bar() {
    let z = 15;
    return x + y + z;
  }

  return bar;
}

let test = foo();
test(); // 45


Enter fullscreen mode Exit fullscreen mode

在上面的代码中,bar是闭包函数,即使外部函数返回后,它仍然可以访问外部变量(x 和 y)。

简化的闭包定义:

  • 闭包是一种能够记住其创建环境的函数。
  • 当一个函数从外部函数返回时,它会携带自身环境。

由于词法作用域的存在,JS 中可以使用闭包。词法作用域的意思是,如果在局部作用域中找不到某个变量,它会在外部作用域中查找,依此类推,直到全局作用域。

词法作用域

闭包中的异常

闭包只有一个例外。在 JavaScript 中,除了通过“new Function”语法创建的函数外,每个函数都是闭包。

通常,函数可以访问创建它的词法环境。但是,当通过“new Function”语法创建函数时,它无法访问词法环境,而是访问全局环境。



function getFunc() {
  let value = "test";

  let func = new Function('value', 'alert(value)');

  return func;
}

getFunc()(); // Undefined


Enter fullscreen mode Exit fullscreen mode

因此,诸如 func 之类的函数(在上面的代码中)无法访问外部变量,而只能访问全局变量。


好了,这篇文章就到这里。希望你能学到一些新东西,如果学到了,请分享并订阅我的新闻通讯,每周接收关于技能构建的精彩内容。

谢谢你!

文章来源:https://dev.to/swastikyadav/understanding-callback-functions-and-closures-in-javascript-154l
PREV
24 个最佳资源🎨 面向 Web 开发者💻 [HTML + CSS + JavaScript] 😱
NEXT
🛑 停止思考 React 生命周期方法。