网易首页 > 网易号 > 正文 申请入驻

JavaScript 闭包实践 | Linux 中国

0
分享至

导读:通过深入了解 JavaScript 的高级概念之一:闭包,更好地理解 JavaScript 代码的工作和执行方式。

本文字数:3359,阅读时长大约: 3分钟

https://linux.cn/article-13140-1.html
作者:Nimisha Mukherjee
译者:Xingyu.Wang

在《》中,我提到了一些高级 JavaScript 概念。在本文中,我将深入探讨其中的一个概念:闭包(closure)。

根据 (MDN),“闭包是将一个函数和对其周围的状态(词法环境)的引用捆绑在一起(封闭)的组合。”简而言之,这意味着在一个函数内部的函数可以访问其外部(父)函数的变量。

为了更好地理解闭包,可以看看作用域及其执行上下文。

下面是一个简单的代码片段:

  1. var hello = "Hello";

  2. function sayHelloWorld() {

  3. var world = "World";

  4. function wish() {

  5. var year = "2021";

  6. console.log(hello + " " + world + " "+ year);

  7. }

  8. wish();

  9. }

  10. sayHelloWorld();

下面是这段代码的执行上下文:

JS 代码的执行上下文

每次创建函数时(在函数创建阶段)都会创建闭包。每个闭包有三个作用域。

◈ 本地作用域(自己的作用域)

◈ 外部函数范围

◈ 全局范围

我稍微修改一下上面的代码来演示一下闭包:

  1. var hello = "Hello";

  2. var sayHelloWorld = function() {

  3. var world = "World";

  4. function wish() {

  5. var year = "2021";

  6. console.log(hello + " " + world + " "+ year);

  7. }

  8. return wish;

  9. }

  10. var callFunc = sayHelloWorld();

  11. callFunc();

内部函数wish()在执行之前就从外部函数返回。这是因为 JavaScript 中的函数形成了闭包。

◈ 当sayHelloWorld运行时,callFunc持有对函数wish的引用。

wish保持对其周围(词法)环境的引用,其中存在变量world

私有变量和方法

本身,JavaScript 不支持创建私有变量和方法。闭包的一个常见和实用的用途是模拟私有变量和方法,并允许数据隐私。在闭包范围内定义的方法是有特权的。

这个代码片段捕捉了 JavaScript 中闭包的常用编写和使用方式:

  1. var resourceRecord = function(myName, myAddress) {

  2. var resourceName = myName;

  3. var resourceAddress = myAddress;

  4. var accessRight = "HR";

  5. return {

  6. changeName: function(updateName, privilege) {

  7. // only HR can change the name

  8. if (privilege === accessRight ) {

  9. resourceName = updateName;

  10. return true;

  11. } else {

  12. return false;

  13. }

  14. },

  15. changeAddress: function(newAddress) {

  16. // any associate can change the address

  17. resourceAddress = newAddress;

  18. },

  19. showResourceDetail: function() {

  20. console.log ("Name:" + resourceName + " ; Address:" + resourceAddress);

  21. }

  22. }

  23. }

  24. // Create first record

  25. var resourceRecord1 = resourceRecord("Perry","Office");

  26. // Create second record

  27. var resourceRecord2 = resourceRecord("Emma","Office");

  28. // Change the address on the first record

  29. resourceRecord1.changeAddress("Home");

  30. resourceRecord1.changeName("Perry Berry", "Associate"); // Output is false as only an HR can change the name

  31. resourceRecord2.changeName("Emma Freeman", "HR"); // Output is true as HR changes the name

  32. resourceRecord1.showResourceDetail(); // Output - Name:Perry ; Address:Home

  33. resourceRecord2.showResourceDetail(); // Output - Name:Emma Freeman ; Address:Office

资源记录(resourceRecord1resourceRecord2)相互独立。每个闭包通过自己的闭包引用不同版本的resourceNameresourceAddress变量。你也可以应用特定的规则来处理私有变量,我添加了一个谁可以修改resourceName的检查。

使用闭包

理解闭包是很重要的,因为它可以更深入地了解变量和函数之间的关系,以及 JavaScript 代码如何工作和执行。

via:

作者: 选题: 译者: 校对:

本文由 原创编译, 荣誉推出

欢迎遵照 CC-BY-NC-SA 协议规定转载,

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
曝陈瑾巫刚定居昆明!在一起20多年不领证,状态松弛像退休老夫妻

曝陈瑾巫刚定居昆明!在一起20多年不领证,状态松弛像退休老夫妻

陈意小可爱
2026-04-04 04:50:48
烧了30小时!百亿航母成废铁?5700人全被扣押,百亿战舰成纸老虎

烧了30小时!百亿航母成废铁?5700人全被扣押,百亿战舰成纸老虎

漫步独行侠
2026-04-05 09:42:53
总部人去楼空!上千家供应商被欠4亿货款,又一明星独角兽暴雷了

总部人去楼空!上千家供应商被欠4亿货款,又一明星独角兽暴雷了

品牌观察官
2026-04-06 17:45:34
特朗普放狠话对付古巴?中国出粮俄送油,连美盟友欧盟都掏钱了!

特朗普放狠话对付古巴?中国出粮俄送油,连美盟友欧盟都掏钱了!

报君知史
2026-04-07 01:18:12
火腿肠三巨头的衰落告诉我们什么:产品没变,时代变了

火腿肠三巨头的衰落告诉我们什么:产品没变,时代变了

富贵说
2026-04-05 18:42:13
广东一男子故意伸腿绊女服务员,致面汤洒顾客身上,面馆老板发声:曾多次滋扰其他顾客,还曾骚扰年轻女孩

广东一男子故意伸腿绊女服务员,致面汤洒顾客身上,面馆老板发声:曾多次滋扰其他顾客,还曾骚扰年轻女孩

大象新闻
2026-04-06 19:53:02
明年起,宝马最古老的工厂将只生产电动汽车

明年起,宝马最古老的工厂将只生产电动汽车

IT之家
2026-04-06 15:12:10
以老者荒谬言论:践踏道德与法理

以老者荒谬言论:践踏道德与法理

烽火瞭望者
2026-04-06 06:31:09
疯了!孙怡《乘风2026》封神现场:盘腿坐喝奶茶怼刘芸

疯了!孙怡《乘风2026》封神现场:盘腿坐喝奶茶怼刘芸

小椰的奶奶
2026-04-06 18:18:30
7896元!iPhone17Pro突然降价:4月6日,上架开卖!

7896元!iPhone17Pro突然降价:4月6日,上架开卖!

搞机小帝
2026-04-06 20:40:35
安徽马鞍山通报“宠物狗上桌就餐”:情况属实,商家已整改

安徽马鞍山通报“宠物狗上桌就餐”:情况属实,商家已整改

界面新闻
2026-04-06 20:30:05
特朗普消失?连续三天未露面引全球猜测,病危还是兵变?真相成谜

特朗普消失?连续三天未露面引全球猜测,病危还是兵变?真相成谜

策略述
2026-04-06 18:12:08
中国移动正式发出官方通知:2026年4月30日开始,开始全国执行

中国移动正式发出官方通知:2026年4月30日开始,开始全国执行

小谈食刻美食
2026-04-05 10:28:19
金与正积极评价韩国总统就无人机事件的表态

金与正积极评价韩国总统就无人机事件的表态

澎湃新闻
2026-04-06 22:52:01
大反转!阵雨、雷雨、8级大风马上到江苏

大反转!阵雨、雷雨、8级大风马上到江苏

江南晚报
2026-04-07 03:33:30
乔任梁父母首次公开其离世内幕,做试管婴儿、欠钱不还、药堆满桌

乔任梁父母首次公开其离世内幕,做试管婴儿、欠钱不还、药堆满桌

八斗小先生
2026-04-06 15:45:07
CBA联赛格局大变:4队进季后赛,广东跌第六,山东重返前四

CBA联赛格局大变:4队进季后赛,广东跌第六,山东重返前四

阿嚼影视评论
2026-04-06 23:11:44
俄国对中国统一大业的态度大变?台海若开战,俄军会有什么动向?

俄国对中国统一大业的态度大变?台海若开战,俄军会有什么动向?

闻香阁
2026-04-07 01:49:36
台湾普通家庭到底啥水平?我去了才知道,答案很现实也让人意外

台湾普通家庭到底啥水平?我去了才知道,答案很现实也让人意外

复转这些年
2026-04-06 23:34:04
特朗普回应伊朗提出的10项要求

特朗普回应伊朗提出的10项要求

第一财经资讯
2026-04-06 23:49:52
2026-04-07 04:23:00
Linux
Linux
Linux 中国开源社区
8018文章数 73113关注度
往期回顾 全部

科技要闻

折叠屏iPhone要来了,富士康已在试产!

头条要闻

特朗普:一夜就能拿下伊朗 可能就是周二晚上

头条要闻

特朗普:一夜就能拿下伊朗 可能就是周二晚上

体育要闻

官方:中国女足球员邵子钦加盟本菲卡

娱乐要闻

唐嫣罗晋新加坡遛娃,6岁女儿身高抢镜

财经要闻

史诗级暴跌"一周年" A股接下来如何走?

汽车要闻

阿维塔06T快上市了 旅行车还能这么玩?

态度原创

艺术
旅游
游戏
本地
公开课

艺术要闻

张雪机车logo陷抄袭争议?商标还被人抢先注册了!

旅游要闻

春日泛舟北小河 水岸花溪美如画

一人开发!国产独立游戏《破晓》4月9日发售

本地新闻

跟着歌声游安徽,听古村回响

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版