Javascript闭包

Javascript 闭包可以理解为一个特殊的函数,这个函数(子函数)定义在另一个函数(父函数)里,通过这个特殊的子函数,也就是闭包,可以访问父函数的环境(变量或函数);

闭包是指那些能够访问独立(自由)变量的函数 (变量在本地使用,但定义在一个封闭的作用域中)。换句话说,这些函数可以“记忆”它被创建时候的环境。

闭包的基本形式如下:

function f1(){
  var a = 5;
  function f2(){
     alert(a);
  }
}

这里的函数f2()就是闭包;
通常情况下,每个变量都有其作用域范围,作用域可分为全局作用域和局部作用域。在函数外部通常是无法访问函数内部的局部变量的。但是通过闭包,我们可以访问到一个函数内部的变量。例如;

      
      
1
2
3
4
5
6
7
8
9
      
      
function f1(){
var a = 5; //局部变量
function f2(){
alert(a);
}
return f2;
}
var result = f1();
result(); //5

需要注意的是,函数f1()执行完成后,并不会立即销毁。也就是说函数f1()的局部变量 a 始终存在于内存中。

比如:

      
      
1
2
3
4
5
6
7
8
9
10
11
12
      
      
function f1(){
var a = 5; //局部变量
aAdd = function () {a += 1;}; //全局函数
function f2(){
alert(a);
}
return f2;
}
var result = f1();
result(); //5
aAdd();
result(); //6

第一次执行result()结果是 5,执行完aAdd()之后,再执行result(),a 就变成 6 了。这是因为f2()的存在依赖于f1()。
既然理解了闭包的概念,那么闭包可以用来干嘛呢?
引用MDN上对于闭包的实践意义:

闭包允许将函数与其所操作的某些数据(环境)关连起来。这显然类似于面向对象编程。在面对象编程中,对象允许我们将某些数据(对象的属性)与一个或者多个方法相关联。
因而,一般说来,可以使用只有一个方法的对象的地方,都可以使用闭包。

我们还可以通过闭包来模拟私有方法:

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
      
      
var Counter = ( function() {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy( 1);
},
decrement: function() {
changeBy( -1);
},
value: function() {
return privateCounter;
}
}
})();
console.log(Counter.value()); /* logs 0 */
Counter.increment();
Counter.increment();
console.log(Counter.value()); /* logs 2 */
Counter.decrement();
console.log(Counter.value()); /* logs 1 */

这里有很多细节。在以往的示例中,每个闭包都有它自己的环境;而这次我们只创建了一个环境,为三个函数所共享:Counter.increment,Counter.decrement 和 Counter.value。
该共享环境创建于一个匿名函数体内,该函数一经定义立刻执行。环境中包含两个私有项:名为 privateCounter 的变量和名为 changeBy 的函数。 这两项都无法在匿名函数外部直接访问。必须通过匿名包装器返回的三个公共函数访问。
这三个公共函数是共享同一个环境的闭包。多亏 JavaScript 的词法范围的作用域,它们都可以访问 privateCounter 变量和 changeBy 函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值