通过深入了解JavaScript的高级概念之一:闭包,更好地理解JavaScript代码的工作和执行方式。在《JavaScript 如此受欢迎的 4 个原因》中,我介绍了一些高级的JavaScript概念。在本文中,我将深入探讨其中一个概念:闭包。根据Mozilla开发者网络(MDN),“闭包是将一个函数和对其周围状态(词法环境)的引用绑定在一起(关闭)的组合。”简而言之,这意味着在函数内部,函数可以访问其外部(父)函数的变量。要更好地理解闭包,请查看作用域及其执行上下文。这是一个简单的代码片段:varhello="Hello";functionsayHelloWorld(){varworld="World";functionwish(){varyear="2021";console.log(你好+""+世界+""+年);}wish();}sayHelloWorld();这是这段代码的执行上下文:JS代码的执行上下文在每次创建函数时(在函数创建阶段)创建一个闭包。每个闭包都有三个作用域。局部作用域(自身作用域)外部函数作用域全局作用域我稍微修改了上面的代码以演示闭包:varhello="Hello";varsayHelloWorld=function(){varworld="World";functionwish(){varyear="2021";console.log(你好+""+世界+""+年);}returnwish;}varcallFunc=sayHelloWorld();callFunc();内部函数wish()在从外部函数返回之前正在执行。这是因为JavaScript中的函数形成闭包。当sayHelloWorld运行时,callFunc持有对函数wish的引用。wish保留对其周围(词汇)环境的引用,变量世界存在于此。私有变量和方法本身,JavaScript不支持创建私有变量和方法。闭包的一个常见和实际用途是模拟私有变量和方法并允许数据隐私。在闭包范围内定义的方法是有特权的。这段代码捕获了在JavaScript中编写和使用闭包的常见方式:varresourceRecord=function(myName,myAddress){varresourceName=myName;varresourceAddress=myAddress;varaccessRight="HR";return{changeName:function(updateName,privilege){//只有HR可以更改名称if(privilege===accessRight){resourceName=updateName;返回真;}else{返回错误;}},changeAddress:function(newAddress){//任何伙伴都可以更改地址resourceAddress=newAddress;},showResourceDetail:function(){console.log("名称:"+resourceName+";地址:"+resourceAddress);}}}//创建第一个记录varresourceRecord1=resourceRecord("Perry","Office");//创建第二个记录varresourceRecord2=resourceRecord("Emma","Office");//改变地址在第一条记录上resourceRecord1.changeAddress("Home");resourceRecord1.changeName("PerryBerry","Associate");//输出为假,因为只有HR可以更改名称resourceRecord2.changeName("EmmaFreeman","HR");//当HR更改名称时输出为真resourceRecord1.showResourceDetail();//输出-姓名:佩里;地址:HomeresourceRecord2.showResourceDetail();//输出-姓名:EmmaFreeman;resourceRecord2)是相互独立的。每个闭包都通过自己的闭包引用不同版本的resourceName和resourceAddress变量。您还可以应用特定规则来处理私有变量,我添加了一个谁可以修改resourceName检查。使用闭包了解闭包很重要,因为它可以更深入地了解变量和函数之间的关系,以及JavaScript代码的工作和执行方式。
