关于闭包的理解

函数的定义

函数的的执行过程
1.函数的定义
1.1在堆里开辟一个空间
1.2把函数体内所有的代码当作字符串存储在这个空间中
1.3把空间地址赋值给栈里的变量(函数名)
2.函数调用
按照存储的地址找到函数存储的空间
在调用栈(不是栈内存)里再次开辟一个函数执行空间
在函数执行空间内进行 形参赋值
在函数执行空间内进行 与解析
把函数存储空间里的代码复制一份拿到函数执行空间 里面执行
代码全部执行完毕,这个新开辟的函数执行空间销毁

所以当函数调用过多,会报内存不够.

定义在函数内部的变量,
会随着函数执行完毕,函数执行空间的销毁而销毁掉。

一个不会被销毁的函数执行空间

函数的每一次执行会创造一个函数执行空间
当函数内部返回一个 复杂数据类型 的时候, 并且函数外部还有变量在接收
这个函数执行空间不会被销毁

全局作用域对应的栈内存;关闭页面的时候会被销毁;
私有作用域的对应的栈内存;一般情况下,函数执行完成,对应的栈内存就会销毁,
当返回值是一个引用数据类型时,不会被销毁;

闭包

形成闭包的条件
一个不会被销毁的函数执行空间
函数内部 直接 或者 间接 的返回一个函数
内部函数操作(访问、赋值)着外部函数的变量

当三个条件都满足的时候
我们管内部的函数叫做外部函数的 闭包函数

闭包的特点:
1.保护变量私有化
优点:不去污染全局
缺点:外部不能访问,需要闭包函数
2.可以在函数外部访问函数内部的变量
优点:不局限于私有变量
缺点:外部访问需要闭包函数
3.变量的生命周期
优点:变量的生命周期被延长了
缺点:一个不会被销毁的函数空间
致命的缺点:一个不会被销毁的函数空间
内存占用太多,浏览器就崩了,内存溢出,内存泄漏,
闭包慎用

function fn() {
    var num = 100;
    return function a() {
      // 访问外部函数fn的私有变量 num
      // 并且把num的值返回
      return num;
    };
  }
  // 此时 res 接受的是 fn函数内部的a 函数
  // 我们管res或者a 叫做fn的闭包函数
  const res = fn();
  // 拿到函数的私有变量 num
  console.log(res());

  // res存储的不再是fn函数内部返回的函数了
  // fn的执行空间被销毁了
  res = 50;

柯里化函数

一种函数的封装形式
把一个函数的两个参数拆开成为两个函数,每一个函数一个参数
多个参数的时候,把第一个参数单独提取出来
柯里化函数主要为了把参数拆开,主要做的事主要为模块化服务的

 //  封装:使用正则去验证用户名
    function fn(reg, name) {
     return reg.test(name);
     }
  // 使用的时候
    const reg = /[^_]\w{5,11}/;
 const res = fn(reg, "guojing");
 console.log(res);
  //   就这么一点事为什么要封装函数?
  //   在模块开发的时候,每一个模块尽量不向外暴露变量,而是向外暴露函数,返回方法
  //   如果验证别的,每次都要传reg
  / const res2 = fn(reg, "huangrong");
 console.log(res2);

// 换一种方式来写
  // 以闭包的形式进行封装、
    function testName(reg) {
      return function (username) {
        return reg.test(username);
      };
     }
  //  将来我使用的时候
  // res接收的是 函数内部 返回的函数
     const resfn = testName(/[^_]\w{5,11}/);

  //   真正进行代码开发的时候;
     const res3 = resfn("guojing");
     console.log(res3);

用闭包解决循环绑定事件问题

export default function Function08() {
  useEffect(() => {
    const wrapDom = document.getElementById("btnwrap");
    const btns = wrapDom.getElementsByTagName("button");
    // es6 let语法 es6转es5也是用闭包的语法,性能问题
    for (let i = 0; i < btns.length; i++) {
      btns[i].onclick = function () {
        console.log(i);
      };
    }

    function fn(index) {
      return function () {
        console.log("我执行了", index);
      };
    }
    // 用闭包解决循环绑定事件问题
    for (var i = 0; i < btns.length; i++) {
      // btns[i].onclick = fn(i);
      btns[i].onclick = (function (index) {
        // 随着循环,每一次这个自执行函数都会执行掉
        // 这个被return 出去的函数才是事件处理函数呢
        return function () {
          console.log("我执行了", index);
        };
      })(i);
    }
  }, []);

  // 变量提升

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

推荐阅读更多精彩内容

  • 什么是闭包?闭包是有权限访问其它函数作用域内的变量的一个函数。 在js中,变量分为全局变量和局部变量,局部变量的作...
    山野林间阅读 121评论 0 0
  • js闭包会把想要改变的属性隐藏在函数内,则外界完完全全是没有办法访问到那个属性的,只有在该函数返回的另一个函数中访...
    热情市民阿俊阅读 126评论 0 0
  • 1.对于闭包,个人理解: 有权访问另一个函数作用域中的变量的函数 示例: 闭包是一种特殊的对象。它由两部分构成:函...
    bin_lifecycle阅读 118评论 0 0
  • 闭包的概念 所谓的闭包就是利用作用域的嵌套,将原本的局部变量进化成私有变量,同时在作用域的外部能够拿到该变量的...
    蚕食我的耐心阅读 217评论 0 1
  • 参考文章 https://www.cnblogs.com/cxying93/p/6103375.html内容相似,...
    Smile_smile_阅读 88评论 0 0