闭包Closure

闭包指的是有权访问另一个函数作用域中变量的函数。

###函数调用过程(第一次被调用时)

1. 创建执行环境(execution context);

2. 创建作用域链,并将作用域链赋值给**特殊的内部属性Scope**;

3. 使用this和arguments等初始化函数的活动对象(activation object),外部函数的活动对象AO位于第二位,外部函数的外部函数的AO位于第三位一直排下去

作用域链本质上是一个指向变量对象的指针列表,指向各变量对象,但不包含对象。在函数中访问变量时,从作用域链中顺序查找该变量。

一般来讲,函数执行完毕之后,局部活动对象会被销毁,仅保存全局对象。

对于闭包,作用域链的销毁不同。

>

>    function a() {

>        var b = "closure";

>        return function() {

>            alert(b);

>        }

>    }

函数a内部返回的匿名函数,会将函数a的活动对象添加到自身的作用域中,因此对于该匿名函数来说,作用域链是本身-a-window。当函数a执行结束后,其活动对象不会被销毁,因为匿名函数的作用域链仍在引用这个活动对象。只有当匿名函数被销毁,函数a的活动对象才会被销毁。

作用域链的配置机制,使得闭包只能取得包含函数中任何变量的最后一个值。因为内部函数保存了外部函数的活动对象,在内部函数中引用变量时,外部函数变量的变化,内部函数中均会同时变化。

>

>    function f() {

>        var results = new Array();

>        for(var i = 0; i < 10; i ++) {

>              results[i] = function() {

>                  return i;

>              };

>        }

>        return results;

>    }

注意results中包含了10个函数,每个函数返回一个值,此时每个函数返回的都是10;因为每个内部函数均包含了函数f的活动对象,包括其中的变量i,而i对应的值最终为10;

>

>      function f() {

>          var results = new Array();

>          for(var i = 0; i < 10; i ++) {

>              results[i] = function(num) {

>                    return function() {

>                        return num;

>                    }

>              }(i);

>          }

>          return results;

>      }

js中函数传参是传值,因此通过将i值传给匿名函数,使得每次返回的值都不一样。

###闭包中的this指针

匿名函数的执行环境具有全局性,因此一般情况下this通常指向window,但也有例外。

>

>    var name = "window";

>    var obj = {

>        name : "obj",

>        f: function() {

>            return function() {

>                return this.name;

>            }

>        }

>      }

>      alert(obj.f()());//window

匿名函数的执行环境是window,因此匿名函数在调用时,作用域链是window-obj;由于第一个活动对象中已经有this指针(访问的是全局的变量name),不会再去查找作用域链,因此外部对象obj的this指针不会被访问到;而当将外部函数的this指针保存到另一个变量中时,则可以访问到,因为全局对象中没有该变量。

>

>    var name = "window";

>    var obj = {

>        name : "obj",

>        f: function() {

> var this = that;

>            return function() {

>                return that.name;

>            }

>        }

>      }

>      alert(obj.f()());//obj

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

推荐阅读更多精彩内容

  • ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...
    lzyuan阅读 916评论 0 0
  • 闭包:指有权访问另一个函数作用域中的变量的函数闭包实现条件:内部函数使用了外部函数的变量、外部函数已退出、内部函数...
    闪电西兰花阅读 279评论 0 0
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,710评论 2 17
  • js中闭包这个概念对于初学js的同学来说, 会比较陌生, 有些难以理解, 理解起来非常模糊. 今天就和大家一起来探...
    已过云烟阅读 269评论 0 1
  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 下面就是...
    鲁uin阅读 296评论 0 2