文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaScript 闭包实践

2024-12-03 10:42

关注

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

在《JavaScript 如此受欢迎的 4 个原因》中,我提到了一些高级 JavaScript 概念。在本文中,我将深入探讨其中的一个概念:闭包closure

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

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

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

  1. var hello = "Hello";
  2.  
  3. function sayHelloWorld() {
  4. var world = "World";
  5.     function wish() {
  6.         var year = "2021";
  7.         console.log(hello + " " + world + " "+ year);
  8. }
  9. wish();
  10. }
  11. sayHelloWorld();

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

 

JS 代码的执行上下文

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

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

  1. var hello = "Hello";
  2.  
  3. var sayHelloWorld = function() {
  4. var world = "World";
  5.     function wish() {
  6.         var year = "2021";
  7.         console.log(hello + " " + world + " "+ year);
  8. }
  9. return wish;
  10. }
  11. var callFunc = sayHelloWorld();
  12. callFunc();

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

私有变量和方法

本身,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

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

使用闭包

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

 

来源:Linux中国内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯