这篇文章主要讲解了“javascript中闭包封的代码案例”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习”javascript中闭包封的代码案例”吧!
简介
闭包是关闭javascript中一个非常强大的功能。所谓闭包就是函数中的函数,内部函数可以访问外部函数的作用域范围,从而可以使用闭包来做一些比较强大的工作。
今天将会给大家详细介绍一下闭包。
函数中的函数
我们提到了函数中的函数可以访问父函数作用域范围的变量,我们看一个例子:
function parentFunction (), { ,var address =, & # 39; flydean.com& # 39;,, ,function alertAddress (), {, ,警报(地址); ,} ,alertAddress (); } parentFunction ();
上面的例子中,我们在parentFunction中定义了一个变量的地址,在parentFunction内部定义了一个alertAddress方法,在该方法内部访问外部函数中定义的地址变量。
上面代码运行是没问题的,可以正确的访问到数据。
封闭包
函数中的函数有了,那么什么是闭包呢?
我们看下面的例子:
function parentFunction (), { ,var address =, & # 39; flydean.com& # 39;,, ,function alertAddress (), {, ,警报(地址); ,} ,return alertAddress; } var myFunc =, parentFunction (); myFunc ();
这个例子和第一个例子很类似,不同之处就是我们将内部函数返回了,并且赋值给了myFunc。
接下来我们直接调用了myFunc。
myFunc中访问了parentFunction中的地址变量,虽然parentFunction已经执行完毕返回。
但是我们在调用myFunc的时候,任然可以访问到地址变量。这就是闭包。
闭包的这个特性非常拥有,我们可以使用闭包来生成函数工厂,如下所示:
function makeAdder (x), { ,return 函数(y), { ,return x  +, y; ,}; } var add5 =, makeAdder (5); var add10 =, makeAdder (10); console.log(折扣(2));//,7 console.log (add10 (2));,//, 12
其中折扣和add10都是闭包,他们是由makeAdder这个函数工厂创建出来的。通过传递不同的x参数,我们得到了不同的基数的增加方法。
最终生成了两个不同的添加方法。
使工厂用函数的概念,我们可以考虑一个闭包的实际应用,比如我们在页面上有三个按钮,通过点击这些按钮可实现修改字体的功能。
我们可以先通过函数工厂来生成三个方法:
function makeSizer(大小),{ ,return 函数(),{=,,document.body.style.fontSize  size +, & # 39; px # 39;; ,}; } var size12 =, makeSizer (12); var size14 =, makeSizer (14); var size16 =, makeSizer (16);
有了这三个方法,我们把DOM元素和回调方法绑定起来:
. getelementbyid (& # 39; size-12& # 39;) .onclick =, size12; . getelementbyid (& # 39; size-14& # 39;) .onclick =, size14; . getelementbyid (& # 39; size-16& # 39;) .onclick =, size16;
使用闭包实现私人方法
对比java来说,java中有私人访问描述符,通过私人的,我们可以指定方法只在类内部访问。
当然,在JS中并没有这个东西,但是我们可以使用闭包来达到同样的效果。
var counter =,(()函数,{ ,var privateCounter =, 0; ,function changeBy (val), { +=,privateCounter val; ,} ,return { 增量:大敌;函数(),{ changeBy才能(1); }, ,减量:函数(),{ changeBy才能(1); }, ,价值:函数(),{ return 才能;privateCounter; ,} ,}; }) (); console.log (counter.value ());//, 0。 counter.increment (); counter.increment (); console.log (counter.value ());//, 2。 counter.decrement (); console.log (counter.value ());//, 1。
我们在父函数中定义了privateCounter属性和changeBy方法,但是这些方法只能够在内部函数中访问。
我们通过闭包的概念,将这些属性和方法封装起来,暴露给外部使用,最终达到了私有变量和方法封装的效果。
闭包的作用域链
对于每个闭包来说,都有一个作用域范围,包括函数本身的作用域,父函数的作用域和全局的作用域。