标签存档: 闭包

2,127 查看

闭包(Closure)详解及Javascript静态变量实现分析

闭包这一词很抽象,事实上概念并不抽象,但是应用起来还真的是很抽象。 先来看看定义(引自百度百科): 闭包是可以包含自由变(未绑定到特定对象)量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在代码块的环境中定义。“闭包”一词来源于以下两者的结合:要执行的代码块和自由变量提供绑定的计算环境。   读完后感觉困惑是很正常的,我现在来好好解释下。 为了方便解释,我们给定义中出现的角色赋上代号,首先我们命名闭包为snippet,包含的自由变量为fvar,全局上下文变量统称为globals,代码块环境是context。 根据定义,我们可以如下改述: snippet含有fvar,此fvar在snippet中没有定义,同时globals中也不含有fvar的定义,所以,当我们单看snippet时候,你会发现fvar是一个未定义的变量。当我们把snippet放到context中,为了让其正常执行,我们需要补全fvar的定义,但又不能在snippet中定义。所以就要在context中定义。   有了上面改述的内容,我们再看一个实例,来加深理解,下面的代码,我使用JavaScript解释: var displayItemName=function(item){ var itemDefault = “default”; var closure1 = function(){ alert(item); } var closure2 = function(){ alert(itemDefault); } closure1(); closure2(); } displayItemName(“football”)   这里的displayItemName函数对应context,这里没有globals,closure对应我们前面说的snippet,closure中的item和itemDefault,对于closure来说是自由变量,也即对应fvar。但是对于context(displayItemName函数)来说,不是自由变量,并在其中定义了。   从这么多角度说,应该能搞清楚闭包的意思了。接下来我们用一句话总结闭包(针对JavaScript),就是: 在一个函数(父函数)中,定义另一个函数(子函数),子函数用到了父函数的变量,但自己并没有重新定义此变量,此时称该子函数为一个闭包。   上面的定义应该比原本的定义好理解多了,但要注意这主要是根据JavaScript的特性总结的,不同的语言室不同的。   …

继续阅读 »

无觅相关文章插件,快速提升流量