中的闭包和计算机php与c语言有什么联系中的闭包有联系吗

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
丰衣足食, 积分 603, 距离下一级还需 397 积分
论坛徽章:3
我很想知道这门简单的语言是否有
1. 散列(关联数组)
3. 静态变量
4. 匿名函数
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
论坛徽章:15
从perl 过来的?要知道这个干嘛?
丰衣足食, 积分 603, 距离下一级还需 397 积分
论坛徽章:3
因为有一个简单的算法要用到这些特性,如果有的话,就可以用 shell 实现了。
富足长乐, 积分 7443, 距离下一级还需 557 积分
论坛徽章:5
貌似不支持。。。。。LZ说说你的需求呗
论坛徽章:15
关联数组有, 至于闭包,静态变量和匿名函数,这个是perl的感念吧,你需要向shell论坛的同学解释其能干什么,如果只是定义变量,函数之类的,都有,但是可能没perl里分的那么细
丰衣足食, 积分 603, 距离下一级还需 397 积分
论坛徽章:3
闭包能定义一个变量有效范围。在这个范围内,定义的函数可以共享这些变量,每次调用的时候,就能产生不同的值,主要是用来生成迭代器之类的东西。
匿名函数,主要是可以动态的调用函数,因为匿名函数是保存在一个变量中,而这个变量保存的是函数的名称。通过关联数组,将这个名字对应的函数映射出来,实现动态的调用。
如果有静态变量,那么就不需要闭包了。
小富即安, 积分 2459, 距离下一级还需 2541 积分
论坛徽章:1
declare可以设置只读变量。静态变量不理解。
间接引用可以把变量名存在变量里。
论坛徽章:104
虽不懂但觉厉
丰衣足食, 积分 603, 距离下一级还需 397 积分
论坛徽章:3
静态变量就是静止的变量,通常用在函数中,每次调用函数,其中的静态变量会一直保存其状态。等到下次调用的时候,就能使用上次的结果。
静态函数通常用在频繁调用一个固定返回值的函数的情况,因为每次返回的值都相同,就在进程中保存这个函数的返回值,下次直接使用,避免重复计算。
如果函数可以保存在一个变量中,也就是说是第一类值(first class), 可以作为参数被传递给别的函数。
这些特性能大大提高编程的灵活性,帮助程序员提高程序的抽象程度,也能够更大限度的增加代码的重用性。
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处浅析javascript语言中的函数闭包现象--《计算机光盘软件与应用》2012年23期
浅析javascript语言中的函数闭包现象
【摘要】:闭包在很多javascript高级应用中都会出现。本文主要以javascript语言为例分析闭包现象的形成,理解闭包的运行机制及使用。
【作者单位】:
【关键词】:
【分类号】:TP312.2【正文快照】:
闭包问题是英格兰Brighton ALT.NET Beers活动中提出来的。闭包的概念很抽象,如果不用代码来说明,将很难用描述性语句把它解释清楚。所以本文将以javascript语言为例解释说明什么是闭包,分析闭包的运行机制及使用注意事项。1闭包的概念什么是闭包?在计算机科学中,闭包(Closure
欢迎:、、)
支持CAJ、PDF文件格式,仅支持PDF格式
【参考文献】
中国期刊全文数据库
张云帆;;[J];电脑知识与技术;2008年35期
邓绪高;;[J];信息与电脑(理论版);2010年12期
【相似文献】
中国期刊全文数据库
B.W.Lampson
,徐家福;[J];计算机工程与应用;1978年10期
卡罗·詹尼罗
,麦克尔·埃·米克努力
,沈逸平;[J];计算机工程与应用;1985年06期
周斌;[J];中国计算机用户;1997年21期
陈斌文,缪栋;[J];计算机工程与设计;2002年04期
初永丽;;[J];微计算机信息;2006年09期
贾美珍;王景丽;;[J];宁波大红鹰职业技术学院学报;2005年02期
陶龙芳;;[J];当代电大;1998年02期
张飞;[J];天中学刊;2004年05期
高钒;[J];宿州学院学报;2004年02期
徐家福;[J];小型微型计算机系统;1983年03期
中国重要会议论文全文数据库
王宇君;胡美琛;施伯乐;;[A];第十一届全国数据库学术会议论文集[C];1993年
丁亚明;;[A];安徽省电机工程学会优秀学术论文集()[C];2005年
徐旭东;叶乃文;;[A];2005全国计算机程序设计类课程教学研讨会论文集[C];2005年
苗壮;张亚非;陆建江;宋自林;;[A];全国语域web与本体能研讨会论文集[C];2006年
王玉清;;[A];数据库研究与进展95——第十三届全国数据库学术会议论文集[C];1995年
马垣;张小平;白雪;王旭;刘杨;杨鸿雁;;[A];第二十一届中国数据库学术会议论文集(技术报告篇)[C];2004年
林羚;卢江;赵瑞莲;;[A];第四届中国测试学术会议论文集[C];2006年
王树西;白硕;;[A];第二届全国信息检索与内容安全学术会议(NCIRCS-2005)论文集[C];2005年
李昊;戴金海;;[A];中国系统仿真学会第五次全国会员代表大会暨2006年全国学术年会论文集[C];2006年
玛依拉·别克强塔伊娃;古丽米拉;;[A];Java技术及应用的进展——第八届中国Java技术及应用交流大会文集[C];2005年
中国重要报纸全文数据库
赵玉勇;[N];电脑报;2003年
曾虹云;[N];电脑报;2005年
王向军;[N];中国电脑教育报;2003年
湖南 张定海;[N];电子报;2010年
刘宝宏;[N];电脑报;2001年
中国博士学位论文全文数据库
姚震;[D];中国科学技术大学;2006年
钟读杭;[D];国防科学技术大学;2007年
李一明;[D];电子科技大学;2011年
尹学松;[D];南京航空航天大学;2009年
王建良;[D];中国海洋大学;2010年
中国硕士学位论文全文数据库
范好信;[D];河北大学;2006年
陈晓林;[D];华中科技大学;2006年
王文俊;[D];西安电子科技大学;2006年
闻晓;[D];西南大学;2009年
刘慧莲;[D];电子科技大学;2009年
臧良俊;[D];辽宁科技大学;2007年
张彦春;[D];西安电子科技大学;2006年
栾绍楠;[D];西安电子科技大学;2006年
吴民峰;[D];华中科技大学;2006年
郁文轶;[D];复旦大学;2009年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 大众知识服务
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备75号学习Javascript闭包(Closure) - 阮一峰的网络日志
学习Javascript闭包(Closure)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
下面就是我的学习笔记,对于Javascript初学者应该是很有用的。
一、变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
  var n=999;
  function f1(){
    alert(n);
  f1(); // 999
另一方面,在函数外部自然无法读取函数内的局部变量。
  function f1(){
    var n=999;
  alert(n); // error
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
  function f1(){
    n=999;
  alert(n); // 999
二、如何从外部读取局部变量?
出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。
那就是在函数的内部,再定义一个函数。
  function f1(){
    var n=999;
    function f2(){
      alert(n); // 999
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
  function f1(){
    var n=999;
    function f2(){
      alert(n);
    return f2;
  var result=f1();
  result(); // 999
三、闭包的概念
上一节代码中的f2函数,就是闭包。
各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
四、闭包的用途
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
怎么来理解这句话呢?请看下面的代码。
  function f1(){
    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    return f2;
  var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
五、使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
六、思考题
如果你能理解下面两段代码的运行结果,应该就算理解闭包的运行机制了。
代码片段一。
  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      return function(){
        return this.
      };
  alert(object.getNameFunc()());
代码片段二。
  var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that =
      return function(){
        return that.
      };
  alert(object.getNameFunc()());
一、什么是内存泄漏?
程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。
学习函数式编程,必须掌握很多术语,否则根本看不懂文档。
本文要回答一个很重要的问题:函数式编程有什么用?
学习函数式编程的过程中,我接触到了 Ramda.js。

我要回帖

更多关于 编程语言 闭包 的文章

 

随机推荐