返回博客列表

闭包

2024年1月18日
3 min read
JavaScript技术

闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建。

function makeAdder(x) {
  return function (y) {
    return x + y;
  };
}

var add5 = makeAdder(5);
var add10 = makeAdder(10);

console.log(add5(2)); // 7
console.log(add10(2)); // 12

从本质上讲,makeAdder 是一个函数工厂 — 他创建了将指定的值和它的参数相加求和的函数。在上面的示例中,我们使用函数工厂创建了两个新函数 — 一个将其参数和 5 求和,另一个和 10 求和。

闭包很有用,因为它允许将函数与其所操作的某些数据(环境)关联起来。这显然类似于面向对象编程。在面向对象编程中,对象允许我们将某些数据(对象的属性)与一个或者多个方法相关联。

因此,通常你使用只有一个方法的对象的地方,都可以使用闭包。

[!Example] 假如,我们想在页面上添加一些可以调整字号的按钮。一种方法是以像素为单位指定 body 元素的 font-size,然后通过相对的 em 单位设置页面中其他元素(例如header)的字号:

body {
 font-family: Helvetica, Arial, sans-serif;
 font-size: 12px;
}

h1 {
 font-size: 1.5em;
}

h2 {
 font-size: 1.2em;
}

写一个闭包

function makeSizer(size) {
  return function () {
    document.body.style.fontSize = size + "px";
  };
}
var size12 = makeSizer(12);
var size14 = makeSizer(14);
var size16 = makeSizer(16);

然后添加到按钮的点击事件上

document.getElementById("size-12").onclick = size12;
document.getElementById("size-14").onclick = size14;
document.getElementById("size-16").onclick = size16;

相关概念

  • 闭包的 GPT 解释
  • JS 中的类:闭包模拟私有方法

参考资料

闭包 - JavaScript | MDN

评论讨论

使用 GitHub 账号登录参与讨论

加载评论中...