简明闭包

闭包向来是javascript的难点之一。

1.定义
2.闭包是如何产生的
3.不仅仅是词法作用域

一 定义

闭包可以看作是javascript函数的一种特性。

二 闭包是如何产生的

从程序语言的角度来看,闭包产生的原因,就是基于词法作用域的作用域链的访问规则。

javascript中作用域只有两种类型,天生的全局环境和函数调用生成的局部环境。

嵌套的调用会产生多个嵌套的环境,就像栈那样。

1.png

对于语言的设计者来讲,就有了一个必须解决的问题,那就是:当你在局部作用域里找不到某一个标识符的时候,是否跨作用域寻找。
最简单粗暴的策略是,找不到就报错,不容许跨作用域找查。

/* 1.0 */
var a=10;
function fun_1(){
        console.log(a);
}
fun_1();            //如果语言被设计为不容许跨越作用域 那么这段代码报错

这种设计比较简(愚)单(蠢),函数无法获得外部的任何信息,如果必要,信息要以参数的形式传入。

第二种策略,容许标识符的解析跨越作用域,也就是说,这个作用域里找不到这个标识符,那么就到上一个作用域中去找(当然不能去下一个,因为下一个作用域还没有生成呢)。
几乎所有的编程语言都支持这种策略,但是在这种策略的具体实现上,设计者们产生了分歧,一个新的问题是: 到底谁才是上一个作用域?。
由于函数调用就像栈的压,出,理所当然的一种策略就是,按调用的顺序来,每一个调用者的作用域都是被
调用者的上一个作用域,就也就是动态作用域。

/* 1.1 */
var a=10;
function fun_1(){
        console.log(a);
}
fun_1(); // 输出10
(function(){
var a='xxx';
fun_1();//输出 ‘xxx’
})();

这种动态作用域,很依赖于函数调用的位置,不同的位置,函数访问的上一个作用域也不相同。
javascript的设计者明显不喜欢这样的设计,语言的设计者,希望函数的上一个作用域,在声明或者是定义的那个地方就确定了,就像一个隐藏的bind。
正所谓,javascript函数运行在它们被定义的作用域内,而不是它们被执行的作用域内,这就是所谓的词法作用域,与函数在那里调用无关。

/* 1.2 */
var a='galbol';
function fun_1(){
          console.log(a);
} //全局环境下定义
fun_1(); // 输出'global'    //全局环境下调用
(function(){
var a='xxx';
fun_1();//输出 ‘global’  //嵌套在函数中调用
})();

这个例子可以看到,我们在全局作用域中定义了函数fun_1,所以,fun_1的上一个作用域即全局作用域,不管在那里被调用,都不会被影响。
这样就产生了闭包,当然上述的例子很单调,无法展现闭包的强大之处,看一下这个例子。

/* 1.3 */
function fun_1(){
  var x=100;
return function(){
  console.log(x);
  }
}
fun_2=fun_1();
fun_2() //输出100

fun_1中定义了一个匿名函数,根据词法作用域,匿名函数的上一个作用域,也就是fun_1调用时生成的局部作用域,即时fun_1调用完毕,这个作用域也不能被垃圾回收处理,因为返回的这个匿名函数,可能使用了fun_1局部作用域中的数据,也只有这个匿名函数能够访问到这个局部作用域中的数据,这就是闭包的强大之处。
<h3>3.不仅仅是词法作用域</h3>
在javascript中,有两个特殊的例子
this this在javascript是个关键字,它的值取决于调用位置,即动态的。
Function构造函数生成的函数,也是闭包,不过函数的上一个作用域永远是全局作用域,而不是声明和定义它们的地方。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容