【Javascript 拾遗之三】 Closure 闭包

说起闭包这个概念,其实是离散数学中的一种定义,而很程序员们耳熟能详但不一定能说清楚它的含义和用途。本文先简单地介绍下离散数学中的闭包,然后再探讨一下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

时间: 2024-11-01 13:41:53

【Javascript 拾遗之三】 Closure 闭包的相关文章

javascript Closure 闭包

引用自 http://www.cnblogs.com/mguo/archive/2013/06/19/3143880.html /*一.变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域.变量的作用域无非就是两种:全局变量和局部变量.Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量.*/ var n=999; function f1(){ alert(n); } f1(); // 999//另一方面,在函数外部自然无法读取函数内的局部变量. funct

JavaScript从作用域到闭包

作用域(scope) 全局作用域和局部作用域 通常来讲这块是全局变量与局部变量的区分. 参考引文:JavaScript 开发进阶:理解 JavaScript 作用域和作用域链 全局作用域:最外层函数和在最外层函数外面定义的变量拥有全局作用域. 1)最外层函数和在最外层函数外面定义的变量拥有全局作用域 2)所有末定义直接赋值的变量自动声明为拥有全局作用域,即没有用var声明的变量都是全局变量,而且是顶层对象的属性. 3)所有window对象的属性拥有全局作用域 局部作用域:和全局作用域相反,局部作

javascript深入理解js闭包(看了挺多的,感觉这篇比较透彻)

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function

java 8 closure 闭包

在functional programming 里面经常提及closure 闭包. 那么究竟闭包是一个什么东东? 让人如何难以理解呢? 1 闭包定义 closure is an instance of a function that can reference nonlocal variables of that function with no restrictions.这是闭包的英文定义.说实在这段定义确实很抽象让人难以理解. 然后我这里其实有两个点把这段定义具体化: 1.1. 闭包就是允许

javascript 拾遗(保持更新总结)

document.getElementById('eastFrame').setAttribute('src','#'); // this will copy father window to this iframe (function() { Grs = function() { return { init : function() { } }; }(); Grs.Ajax = function() { return { }; }(); })(); //what does this do 页面

【Javascript 拾遗之六】深入Javascript数据类型和对象类型

通过前几章的讲解,我们已经摸清楚Javascript的几个重要特征,具有类概念的函数,“函数”实例化的后得到对象, 原型链, 函数的定义等等.作为高级脚本语言的Javascript同样是面向对象的语言,但是Javascript中的数据类型不像JAVA中的“万物皆对象”,本文我们就来深入学习一下Javascript中的几种数据类型及其判断.Let's start learning, move it! 深入Javascript数据类型 1.5种基本数据类型和1种复杂数据类型 5种基本数据类型包括 :

[从jQuery看JavaScript]-匿名函数与闭包(Anonymous Function and Closure)

jQuery片段: [javascript] view plaincopyprint? (function(){ //这里忽略jQuery所有实现 })(); (function(){//这里忽略jQuery所有实现})(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我就迷糊了.为什么只有一个匿名函数又没看到运行(当然是运行了……),就能有jQuery这么个函数库了?于是,我抱着疑问来到CSDN.结果相信现在很多人都很清楚了(因为

javascript基础知识:闭包(closure)

(1)javascript的变量特点:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量.在函数内部声明变量的时候,一定要使用var命令.如果不用的话,声明的是一个全局变量! 闭包就是有权访问另一个函数作用域内变量的函数函数能够记住自己定义时所处的作用域的环境闭包的用途:可以读取函数内部的变量,让这些变量的值始终保持在内存中,不会在调用后被自动清除.使用闭包的注意事项:正常的情况下函数调用结束之后函数的执行环境离开环境栈,定义的变量会被垃圾回收机制回收,变量对象会被销毁,内存

javascript深入理解js闭包

一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需要注意,函数