图解 | 理解闭包

文 / 景朝霞

来源公号 / 朝霞的光影笔记

ID / zhaoxiajingjing

图 / 自己画

❥❥❥❥点个赞,让我知道你来过~❥❥❥❥


前情提要:

  1. 题目 | let和var的区别(一、二)
  2. 图解 | let和var的区别(一、二)
  3. 题目 | 带VAR和不带VAR的区别
  4. 图解 | 带VAR和不带VAR的区别
  5. 总结 | LET和VAR区别(三、四)
  6. 图解 | 作用域和作用域链
  7. 练习题 | 作用域和作用域链

0 / 看图说话

var n = 1;
function fn(){
    var n = 2;
    function f(){
        n--;
        console.log(n);
    }
    f();
    return f;
}
var x = fn();
x();
console.log(n);
公号ID:zhaoxiajingjing

△ 画简版的,不用的会出栈销毁

创建函数

  1. 开辟一个堆内存
  2. 把函数体中的代码以字符串格式存到堆内存中
  3. 把堆内存的地址赋值给函数名/变量名
  4. 函数在哪创建的,在执行时需要查找的上级作用域就是谁。即:FN[scope]:VO(G) F[scope]:AO(FN)

函数执行

  1. 开一个全新的栈内存:执行上下文EC(xx),会形成一个全新的私有作用域AO(xx)
  2. 形参赋值,变量提升(形参和在私有作用域中声明的变量:私有变量)
  3. 代码执行,把堆内存的代码字符串一行行拿出来运行
  4. 遇到变量:作用域链查找机制,找到它。
    • 看它是否为自己当前执行上下文/私有作用域下的私有变量
    • 是私有的,拿来用即可
    • 不是自己私有的,沿着scopeChain作用域链向上级作用域查找。
    • 上级作用域,如果有该变量,拿来用;如果没有该变量,再沿着作用域链向上级作用域查找
    • 一直找到全局作用域为止
  5. <u>私有变量和外界的变量没有必然关系,可以理解为被私有栈内存保护起来了,这种机制就是闭包保护机制</u>

其中,EC(FN) 执行上下文在执行完后,返回了一个小函数f,外面的x接收了小函数f的地址。那么,EC(FN)执行上下文/私有作用域中有东西被外界占用了,所以不会被销毁。

1 / 闭包

来~再念一遍:

<u>函数执行会形成一个全新的私有作用域,保护里面的变量不受外界干扰,这种保护机制就称为闭包。</u>

但是,我们经常听到这样说的:

函数执行会形成一个私有作用域,而这个栈内存不销毁,这样里面的私有变量与外面的不冲突,并且能保存这些值,叫做闭包。

这种说法呢,只把不销毁而留下来的称为闭包。

但,我理解的是当它形成了就已经是闭包了,这两种说法都OK,看个人理解认为哪种都OK。

闭包有两个作用:保护、保存

  • 保护:保护私有变量不让外界干扰,与外界没有必然联系
  • 保存:形成一个不销毁的私有作用域,私有栈内存里面的东西会保存下来;以后它里面的东西还能被调用到

2 / 练习题

请画图理解:作用域链查找机制、闭包机制。像上图画简单的即可。

  1. 输出结果是?fn函数执行完后是否会销毁?
console.log(a, b);
var a = 12,
    b = 12;
function fn(){
    console.log(a, b);
    var a = b = 13;
    console.log(a, b);
}
fn();
console.log(a, b);

注意:

var a = 12,
    b = 12;
// 等价于
var a = 12;
var b = 12;
var a = b = 1;
// 等价于
var a = 1;
b =1;
  1. 输出结果是什么?哪些执行完后不会销毁?为什么?
var i = 20;
function fn(){
    i -= 2;
    return function (n) {
        console.log(++i-n):
    };
}
var f = fn();
f(1);
f(2);
fn()(3);
fn()(4);
f(5);
console.log(i);
  1. 输出结果是?
var i = 0;
function A(){
    var i = 10;
    function x(){
        console.log(x);
    }
    return x;
}
var y = A();
y();
function B(){
    var i = 20;
    y();
}
B();

3 / 预告

如何判断THIS?

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

推荐阅读更多精彩内容