关闭javascript中闭包的代码案例

  介绍

这篇文章主要讲解了“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方法,但是这些方法只能够在内部函数中访问。

我们通过闭包的概念,将这些属性和方法封装起来,暴露给外部使用,最终达到了私有变量和方法封装的效果。

闭包的作用域链

对于每个闭包来说,都有一个作用域范围,包括函数本身的作用域,父函数的作用域和全局的作用域。

关闭javascript中闭包的代码案例