码迷,mamicode.com
首页 > 编程语言 > 详细

【Javascript 拾遗之三】 Closure 闭包

时间:2014-12-31 14:20:56      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:

说起闭包这个概念,其实是离散数学中的一种定义,而很程序员们耳熟能详但不一定能说清楚它的含义和用途。本文先简单地介绍下离散数学中的闭包,然后再探讨一下Javascript语言中的闭包是如何创建和应用的。

Closure 闭包

1、闭包的定义

-离散数学

一个关系不具有自反, 对称, 传递这3种基本性质之一,但均可以通过对该关系的扩充(在关系中增添序偶),使扩充后的关系具有这种性质,这种包含该关系的最小扩充称为该关系关于这种性质的闭包.

下面给出闭包的定义:

设R是X上的关系,R的自反(或对称,传递)闭包R1是这样的:包含R(或R包含于R1)的自反(或对称,传递)关系,对任意的自反(对称,传递) 关系S,如果R包含于S,则必有R1包含于S.

满足的条件:
  设R是非空集合A上的关系, R的自反(对称或传递)闭包是A上的关系R‘ ,满足
  (1) R‘是自反的(对称的,或传递的)
  (2)
技术分享
 
      (3)对A上任何包含[R的自反(或对称的,或传递的)]关系R"有技术分享
 
 
   记号:

   r(R) - R的自反闭包, reflexivity

   s(R) - R的对称闭包, symmetry

   t(R) - R的传递闭包。 transmit

技术分享

R={<a,b>,<b,a>,<b,c>,<c,d>}
技术分享
r(R)={<a,a>,<b,b>,<c,c>,<d,d>,<a,b>,<b,a>,<b,c>,<c,d>}
技术分享
s(R)={<a,b>,<b,a>,<b,c>,<c,b>,<c,d>,<d,c>}
技术分享
t(R)={<a,b>,<a,b>,<a,c>,<a,d>,<b,c>,<b,d>,<b,a>,<b,b>,<c,d>}

-Javascript

在Javascript高级程序设计中提到:Javascript闭包就是在函数中定义函数,实现的功能就是在函数外部也能访问函数内部的局部变量。

1 var closure = function(){
2     var a = 100;
3     var alertA = function(){
4         return(a);
5     }
6     return alertA;
7 }
8 console.log(closure()());  //100

这个玩意就是闭包,他可以在函数外部访问函数内部的变量,是不是很神奇?

其实没啥神奇的,代码示例中closure()执行了closure这个方法,返回了一个匿名函数,这是一个没有执行的匿名函数,然后通过()函数运算符,执行了closure中的alertA这个方法。alertA返回了私有变量a的值,我们称在子函数中使用父函数的局部变量的结构为闭包结构

 

我们再看一个例子

 1 function createFunctions(){
 2     var result = new Array();
 3     
 4     for(var i = 0; i < 10; i++){
 5         result[i] = function(num){
 6             return function(){
 7                 return num;
 8             }
 9         }(i);
10     }
11     return result;
12 }
13 
14 var funcs = createFunctions();
15 for(var i = 0; i < funcs.length; i++){
16     console.log(funcs[i]());
17 }

 

代码示例中createFunctions返回了一个数组,该数组指向多个定义的匿名函数生成的对象,这个闭包可以通过数组不同的索引来调用,相当于一个多元的闭包,在模块化开发时候可以使用这个结构。

2、闭包的应用

 待续

3、闭包的缺点

 待续

4、总结

 本文通过几个简单的例子介绍了Javascript的闭包及其应用,实际开发中由于闭包长期内存需要代码释放和比较难理解的语法,所以在没有必要的情况下不建议使用闭包。

5、参考资料

Javascript 高级程序设计第二版

http://cise.sdust.edu.cn/lssx/7StressResolve/cha3/36.htm

 

【Javascript 拾遗之三】 Closure 闭包

标签:

原文地址:http://www.cnblogs.com/keaixiaoye/p/4184367.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!