当前位置: 首页 > Web前端 > JavaScript

什么是JavaScript中的闭包?

时间:2023-03-27 14:08:31 JavaScript

1.什么是闭包?闭包(closure)就是通过嵌套函数,将嵌套函数及其执行环境缓存起来,等待下一次调用。直观来说,就是形成一个不被破坏的栈环境。这保护了变量和方法,使它们成为私有的。1.私有变量函数makeFunc(){varname="Mozilla";功能显示名称(){警报(名称);}returndisplayName;}//闭包隐藏了变量名,所以myFunc不能直接访问varmyFunc=makeFunc();//只能通过闭包访问nameFunc();2、缓存执行环境functionmakeAdder(x){returnfunction(y){returnx+y;};}//闭包的执行环境为Cache,即x的值和嵌套函数缓存在add5varadd5=makeAdder(5);//调用并执行闭包,输出结果:7console.log(添加5(2));3、数据封装和隐藏的JavaScriptJava中没有private关键字,但是可以用闭包来实现对数据的隐藏和封装。//成功隐藏变量(privateCounter)和方法(changeBy)varmakeCounter=function(){varprivateCounter=0;函数changeBy(val){privateCounter+=val;}return{increment:function(){changeBy(1);},减量:function(){changeBy(-1);},值:函数(){返回privateCounter;}}};varCounter1=makeCounter();varCounter2=makeCounter();console.log(Counter1.value());/*记录0*/Counter1.increment();Counter1.increment();console.log(Counter1.value());/*记录2*/Counter1.decrement();console.log(Counter1.value());/*记录1*/console.log(Counter2.value());/*logs0*/4.如果没有特殊的性能优化需求,在函数内创建函数是不明智的。因为闭包会消耗更多的CPU和内存资源,它们会对脚本性能产生负面影响。创建新对象时,方法应该定义在原型中,而不是对象构造函数中。因为每次创建一个对象,构造函数中的方法都要重新赋值。//使用闭包的错误方式,//因为每个新的MyObject都会重新分配getName和getMessagefunctionMyObject(name,message){this.name=name.toString();this.message=message.toString();this.getName=function(){返回this.name;};this.getMessage=function(){返回this.message;};}//推荐用这个方法代替上面的。//原型为所有MyObject对象共享,无需重新分配getName和getMessagefunctionMyObject(name,message){this.name=name.toString();this.message=message.toString();}MyObject.prototype.getName=function(){returnthis.name;};MyObject.prototype.getMessage=function(){returnthis.message;};2.参考文档:JavaScript的闭包是什么?