首页 web前端 js教程 了解 JavaScript 闭包:综合指南

了解 JavaScript 闭包:综合指南

Nov 06, 2024 pm 07:47 PM

Understanding JavaScript Closures: A Comprehensive Guide

了解 JavaScript 闭包:综合指南。

什么是闭包?

闭包是一个基本的 JavaScript 概念,其中内部函数可以访问其外部(封闭)函数的变量和参数,即使在外部函数完成执行之后也是如此。简而言之,闭包允许函数“记住”并访问其外部作用域中的变量,即使该函数在不同的作用域中执行也是如此。

闭包的三个范围

JavaScript 中的每个闭包都可以访问三个作用域:

  • 它自己的作用域(函数内部定义的变量)
  • 外部函数的变量(来自其父函数的变量)
  • 全局变量(整个应用程序中可用的变量)

词汇范围:基础

让我们通过一个基本示例来了解词法作用域:

function init() {
  var name = "Mozilla"; // local variable created by init
  function displayName() {
    // inner function
    console.log(name); // uses variable declared in parent function
  }
  displayName();
}
init();
登录后复制

在此示例中:

  • init() 函数创建一个局部变量名称和一个内部函数 displayName()
  • displayName() 是一个内部函数,仅存在于 init()
  • displayName() 没有自己的局部变量
  • 由于词法作用域,它可以访问其父作用域中的变量,包括名称

理解行动中的闭包

让我们看一下演示闭包的稍加修改的版本:

function makeFunc() {
  const name = "Mozilla";
  function displayName() {
    console.log(name);
  }
  return displayName;
}

const myFunc = makeFunc();
myFunc();
登录后复制

理解要点:

  • 这看起来与前面的示例类似,但有一个关键的区别
  • 我们不是立即执行内部函数,而是返回它
  • 即使 makeFunc() 已经执行完毕,myFunc 仍然可以访问 name 变量
  • 这是可能的,因为该函数维护对其词法环境的引用

实例:函数工厂

这里有一个更实际的例子,展示了闭包的威力:

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

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

console.log(add5(2));  // outputs 7
console.log(add10(2)); // outputs 12
登录后复制

让我们来分析一下发生了什么:

  • makeAdder 是一个函数工厂 - 它创建自定义函数
  • 它创建的每个函数都会记住传递给 makeAdder 的 x 值
  • add5 和 add10 都是闭包:

它们共享相同的函数定义
但他们有不同的词汇环境
在add5的环境中,x是5
在add10的环境中,x是10

为什么关闭很重要

闭包非常强大,因为它们允许:

  1. 数据隐私:闭包内的变量保持私有,无法从外部访问
  2. 状态保存:它们可以在函数调用之间维护状态
  3. 函数工厂:您可以使用预设参数创建专门的函数
  4. 模块模式:它们是 JavaScript 中模块模式的基础

结论

理解闭包对于 JavaScript 开发人员来说至关重要,因为它们广泛用于现代 JavaScript 模式、框架和库中。它们提供了一种在函数式编程中创建私有变量和维护状态的方法,同时保持代码整洁和可维护。

记住: 闭包不仅仅是另一个函数中的函数 - 它是一个可以访问其外部作用域中的变量的函数,并且即使在外部函数完成执行后也能保持该访问权限。

以上是了解 JavaScript 闭包:综合指南的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何创建和发布自己的JavaScript库? 如何创建和发布自己的JavaScript库? Mar 18, 2025 pm 03:12 PM

文章讨论了创建,发布和维护JavaScript库,专注于计划,开发,测试,文档和促销策略。

如何在浏览器中优化JavaScript代码以进行性能? 如何在浏览器中优化JavaScript代码以进行性能? Mar 18, 2025 pm 03:14 PM

本文讨论了在浏览器中优化JavaScript性能的策略,重点是减少执行时间并最大程度地减少对页面负载速度的影响。

前端热敏纸小票打印遇到乱码问题怎么办? 前端热敏纸小票打印遇到乱码问题怎么办? Apr 04, 2025 pm 02:42 PM

前端热敏纸小票打印的常见问题与解决方案在前端开发中,小票打印是一个常见的需求。然而,很多开发者在实...

如何使用浏览器开发人员工具有效调试JavaScript代码? 如何使用浏览器开发人员工具有效调试JavaScript代码? Mar 18, 2025 pm 03:16 PM

本文讨论了使用浏览器开发人员工具的有效JavaScript调试,专注于设置断点,使用控制台和分析性能。

谁得到更多的Python或JavaScript? 谁得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript开发者的薪资没有绝对的高低,具体取决于技能和行业需求。1.Python在数据科学和机器学习领域可能薪资更高。2.JavaScript在前端和全栈开发中需求大,薪资也可观。3.影响因素包括经验、地理位置、公司规模和特定技能。

如何使用源地图调试缩小JavaScript代码? 如何使用源地图调试缩小JavaScript代码? Mar 18, 2025 pm 03:17 PM

本文说明了如何使用源地图通过将其映射回原始代码来调试JAVASCRIPT。它讨论了启用源地图,设置断点以及使用Chrome DevTools和WebPack之类的工具。

如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? 如何使用JavaScript将具有相同ID的数组元素合并到一个对象中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中将具有相同ID的数组元素合并到一个对象中?在处理数据时,我们常常会遇到需要将具有相同ID�...

console.log输出结果差异:两次调用为何不同? console.log输出结果差异:两次调用为何不同? Apr 04, 2025 pm 05:12 PM

深入探讨console.log输出差异的根源本文将分析一段代码中console.log函数输出结果的差异,并解释其背后的原因。�...

See all articles