一句话闭包--有状态的记忆

1 .定义在函数内部的函数,能够读取其他函数内部变量的函数。将变量包工在匿名函数中,突破函数作用域的限制。
2 .闭包是一种特殊的对象。它有两部分组成,函数,以及创建这个函数的环境。环境是由闭包创建是在作用域内的任何变量组成
3.闭包的用途:

1.读取函数内部的变量,创建含有隐藏数据的函数。
2.让变量的值始终保存在内存中。f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2也是依赖于f1,所以f1始终在内存中,不会再函数调用之后,被垃圾回收机制回收。用闭包模拟私有方法,不仅可以有利于限制对代码的访问,还提供了管理全局命名空间的强大能力,避免非核心的方法弄乱了代码的公共接口部分。
  var Counter=(function(){
            var private=0;
            function changeBy(val){
                private+=val
            }
            // 共享函数和变量。
            // 该共享环境创建于一个匿名的函数体内,该函数一经定义就立刻执行。环境中有两个私有项:一个变量,和一个私有函数,这些东西都是无法在匿名函数外部直接访问到。他的访问必须通过匿名包装器返回的三个公共函数访问
            return {
                // 私有函数
                choose1:function(){
                    changeBy(1);
                },
                choose_1:function(){
                    changeBy(-1);
                },
                value:function(){
                    return private;
                }
            }
        })()
                    
 var db = (function() {
// 创建一个隐藏的object, 这个object持有一些数据
// 从外部是不能访问这个object的
var data = {};
// 创建一个函数, 这个函数提供一些访问data的数据的方法
return function(key, val) {
            if (val === undefined) { return data[key] } // get
          else { return data[key] = val } // set
}
// 我们可以调用这个匿名方法
// 返回这个内部函数,它是一个闭包
})();

db('x'); // 返回 undefined
db('x', 1); // 设置data['x']为1
db('x'); // 返回 1
// 我们不可能访问data这个object本身
// 但是我们可以设置它的成员


3.由于有了闭包,而且函数也是对象,一个函数可以向一个传统对象那样拥有自己的属性,私有数据和状态,不会随着栈而清空,许多简单的功能也无需借助object来实现了。

4.闭包是一种设计原则,他通过分析上下文,来简化用户的调用,让用户在不知晓的情况下达到他的目的。封装变量,computed计算属性,将之前的计算属性缓存起来,下次调的时候就可以直接返回结果,而不需要参与运算,这里存放结果的变量不需要暴露给外界,并且需要在函数运行之后,任然保存,所以可以采用闭包,源码采用的是消息发布订阅模式

5.管理私有变量和私有方法,将变量的变化封装在安全的环境中

4 .闭包注意的问题

1.闭包会使函数中的变量都保存在内存中,内存的消耗很大,所有在退出函数的时候,不用的变量都要消除
2.闭包会在父函数外部,改变父函数内部变量的值。所以如果你把父函数当成对象使用,把闭包当成他的公用方法,把内部变量当做他的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。
3.自执行函数不是闭包,但是他解决全局变量的污染问题。

5 .不使用return关键字的闭包实例 setTimeout函数

    for(var i = 0, len = btns.length; i < len; i++) {//还有这一种,好像异步执行的都可以?
      (function(i) {
             btns[i].onclick = function() {
                alert(i);
          }
      }(i))

}
6 .闭包的经典使用场景:通过循环给页面上多个dom绑定事件
7 .封装变量
8 .延长局部变量的使用寿命

var report = (function() {
  var imgs = [];
    return function(src) {
        var img = new Image();
        imgs.push(img);
        img.src = src;
  }

}())
9 .模拟实现对象的写法
10 .为某一个函数执行前先执行的函数提供参数。
11 .将函数关联到对象的实例方法--封闭一个js对象来参与一个特定的dom元素的交互,并且想在dom元素上对应的事件被触发的时候执行这些方法。
12 .如果一个函数依赖另外一个或几个函数,但是其他函数并不期望与任何其他的代码产生交互,那么就可以使用闭包来扩展组织这些函数。

闭包与this

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,513评论 18 399
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,108评论 29 470
  • 在打开模拟器后使用截屏快捷键Commad + S ,模拟器就会闪退并出现这样的一个提示: 使用command+s截...
    沉默的鱼sunny阅读 1,057评论 0 0
  • 回顾之前学习过的内容,抛弃抱怨,能看得别人的好,去发现他人的优点,鼓励和赞美他们,让自己成为正能量的源头,慢慢的自...
    随意咖啡阅读 652评论 0 0
  • 重点 主机规划与磁盘分区 各硬件装置在Linux中的文件名 p66 磁盘分区:课本例题 p67 磁盘分区表例...
    GeniusVJR阅读 1,613评论 1 0